GLDisplayListWidget.cpp

00001 //
00002 //###########################################################################
00003 //                            GLDisplayListWidget.cpp
00004 //###########################################################################
00005 // 
00006 //                  SOURCE FILE FOR CLASS GLDisplayListWidget        
00007 //
00008 //###########################################################################
00009 //
00010 // Chris Anderson (C) UCLA 2007-09 
00011 //
00012 // 02/26/09
00013 
00014 #include <QtGui>
00015 #include <QtOpenGL>
00016 
00017 #include <math.h>
00018 #include <iostream>
00019 using namespace std;
00020 
00021 #include "GLDisplayListWidget.h"
00022 #include "GLDriverQt.h"
00023 
00024 GLDisplayListWidget::GLDisplayListWidget(QWidget *parent)
00025     : QGLWidget(parent)
00026 {
00027     xRot     = 0;
00028     yRot     = 0;
00029     zRot     = 0;
00030     Gldriver.SetGLDisplayListWidget(this);
00031     initializeGL();
00032 }
00033 
00034 GLDisplayListWidget::~GLDisplayListWidget()
00035 {
00036     makeCurrent();
00037     glDeleteLists(Gldriver.getDisplayList(), 1);
00038 }
00039 
00040 QSize GLDisplayListWidget::minimumSizeHint() const
00041 {
00042     return QSize(50, 50);
00043 }
00044 
00045 QSize GLDisplayListWidget::sizeHint() const
00046 {
00047     return QSize(400, 400);
00048 }
00049 
00050      
00051 void GLDisplayListWidget::setXRotation(int angle)
00052 {
00053     normalizeAngle(&angle);
00054     if (angle != xRot) {
00055         xRot = angle;
00056         updateGL();
00057     }
00058 }
00059 
00060 void GLDisplayListWidget::setYRotation(int angle)
00061 {
00062     normalizeAngle(&angle);
00063     if (angle != yRot) {
00064         yRot = angle;
00065         updateGL();
00066     }
00067 }
00068 
00069 void GLDisplayListWidget::setZRotation(int angle)
00070 {
00071     normalizeAngle(&angle);
00072     if (angle != zRot) {
00073         zRot = angle;
00074         updateGL();
00075     }
00076 }
00077 
00078 void GLDisplayListWidget::initializeGL()
00079 {
00080     qglClearColor(QColor(255,255,255));
00081     glShadeModel(GL_FLAT);
00082     glEnable(GL_DEPTH_TEST);
00083     glEnable(GL_CULL_FACE);
00084 }
00085 
00086 void GLDisplayListWidget::paintGL()
00087 {
00088     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
00089     glLoadIdentity();
00090     glTranslated(0.0, 0.0, -10.0);
00091     glRotated(xRot / 16.0, 1.0, 0.0, 0.0);
00092     glRotated(yRot / 16.0, 0.0, 1.0, 0.0);
00093     glRotated(zRot / 16.0, 0.0, 0.0, 1.0);
00094     if(glIsList(Gldriver.getDisplayList()))
00095     {
00096         glCallList(Gldriver.getDisplayList());
00097     }
00098 
00099 }
00100 
00101 void GLDisplayListWidget::resizeGL(int width, int height)
00102 {
00103     int side = qMin(width, height);
00104     glViewport((width - side) / 2, (height - side) / 2, side, side);
00105 
00106     glMatrixMode(GL_PROJECTION);
00107     glLoadIdentity();
00108     glOrtho(-0.6, +0.6, -0.6, +0.6, 4.0, 15.0);
00109     glMatrixMode(GL_MODELVIEW);
00110 }
00111 
00112 void GLDisplayListWidget::mousePressEvent(QMouseEvent *event)
00113 {
00114     lastPos = event->pos();
00115 }
00116 
00117 void GLDisplayListWidget::mouseMoveEvent(QMouseEvent *event)
00118 {
00119     int dx = event->x() - lastPos.x();
00120     int dy = event->y() - lastPos.y();
00121 
00122     if (event->buttons() & Qt::LeftButton) {
00123         setXRotation(xRot + 8 * dy);
00124         setYRotation(yRot + 8 * dx);
00125     } else if (event->buttons() & Qt::RightButton) {
00126         setXRotation(xRot + 8 * dy);
00127         setZRotation(zRot + 8 * dx);
00128     }
00129     lastPos = event->pos();
00130 }
00131 
00132 
00133 void GLDisplayListWidget::normalizeAngle(int *angle)
00134 {
00135     while (*angle < 0)
00136         *angle += 360 * 16;
00137     while (*angle > 360 * 16)
00138         *angle -= 360 * 16;
00139 }

Generated on Tue Feb 17 11:57:13 2009 for QtGLgraphics by  doxygen 1.5.1-p1