00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
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 }