diff options
author | Jakob Odersky <jodersky@gmail.com> | 2011-04-13 00:10:05 +0000 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2011-04-13 00:10:05 +0000 |
commit | d4c30f04e6b84df2d88841f1544d16ef9973ffb1 (patch) | |
tree | 1dbd125be32ccf0929c1af9a6b5547687e52013e /src/gui/Stage.cc | |
parent | 12c329da1549af51724b487cc6ae5127934e6cff (diff) | |
download | vhc-d4c30f04e6b84df2d88841f1544d16ef9973ffb1.tar.gz vhc-d4c30f04e6b84df2d88841f1544d16ef9973ffb1.tar.bz2 vhc-d4c30f04e6b84df2d88841f1544d16ef9973ffb1.zip |
Continuation de la classe Stage. On arrive maintenant a visualiser un accelerateur.
Diffstat (limited to 'src/gui/Stage.cc')
-rw-r--r-- | src/gui/Stage.cc | 134 |
1 files changed, 130 insertions, 4 deletions
diff --git a/src/gui/Stage.cc b/src/gui/Stage.cc index 318c2b8..14effa1 100644 --- a/src/gui/Stage.cc +++ b/src/gui/Stage.cc @@ -5,12 +5,15 @@ * Author: jakob */ - +#include "util.h" #include "Stage.h" +using namespace vhc::util; + namespace vhc { -Stage::Stage(QWidget* parent): QGLWidget (parent), elements(0), camera(), elementRenderer(new ElementRenderer), particleRenderer(), wireframe(false) { + +Stage::Stage(QWidget* parent): QGLWidget (parent), accelerator(NULL), camera(), elementRenderer(new ElementRenderer), particleRenderer(), wireframe(false), keys(0) { setMouseTracking(true); } @@ -22,7 +25,6 @@ void Stage::initializeGL () { glEnable (GL_DEPTH_TEST); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); - gluPerspective(65.0, 1.6, 0.1, 10000.0); glClearColor (0, 0, 0, 1.0); } @@ -30,10 +32,134 @@ void Stage::resizeGL (int width, int height) { glViewport (0, 0, width, height); glMatrixMode (GL_PROJECTION); glLoadIdentity(); - gluPerspective(65.0, 1, 1.0, 10000.0); + gluPerspective(65.0, 1.0 * width / height, 1.0, 10000.0); glMatrixMode (GL_MODELVIEW); } +void Stage::paintGL() { + glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glLoadIdentity (); + + camera.setView(); + + glPushMatrix(); + glScaled(100, 100, 100); + glColor3d(0.5, 0.5, 0.5); + grid(20); + axes(); + glPopMatrix(); + + center = QWidget::mapToGlobal(QPoint(this->size().width() / 2, this->size().height() / 2)); + QCursor::setPos(center); + + glScaled (100.0, 100.0, 100.0); + + + if (wireframe) { + glPolygonMode(GL_FRONT, GL_LINE); + glPolygonMode(GL_BACK, GL_LINE); + } else { + glPolygonMode(GL_FRONT, GL_FILL); + glPolygonMode(GL_BACK, GL_FILL); + } + + + if (accelerator != NULL){ + glColor3d(0.9, 0.4, 0); + for (unsigned int i = 0; i < accelerator->getElements().size(); ++i) { + accelerator->getElements()[i]->accept(*elementRenderer); + } + glColor3d(0, 0, 1); + for (unsigned int i = 0; i < accelerator->getParticles().size(); ++i) { + particleRenderer.render(*(accelerator->getParticles()[i])); + } + } + + + +} + +void Stage::mouseMoveEvent(QMouseEvent* event) { + int dheading = -QCursor::pos().x() + center.x(); + int dpitch = -QCursor::pos().y() + center.y(); + camera.addHeading(1.0 * dheading / 200); + camera.addPitch(1.0 * dpitch / 200); + updateGL(); +} +void Stage::keyPressEvent (QKeyEvent* event) { + Vector3D mv = Vector3D::Null; + switch (event->key()) { + case Qt::Key_Escape: + qApp->quit(); + break; + case Qt::Key_A: + //mv = mv - Vector3D::j; + keys |= 1; + break; + case Qt::Key_W: + //mv = mv - Vector3D::i; + keys |= 2; + break; + case Qt::Key_D: + //mv = mv + Vector3D::j; + keys |= 4; + break; + case Qt::Key_S: + //mv = mv + Vector3D::i; + keys |= 8; + break; + case Qt::Key_Up: + camera.addPitch(2 * M_PI / 100); + break; + case Qt::Key_Down: + camera.addPitch(-2 * M_PI / 100); + break; + case Qt::Key_Right: + camera.addHeading(-2 * M_PI / 100); + break; + case Qt::Key_Left: + camera.addHeading(2 * M_PI / 100); + break; + case Qt::Key_R: + break; + case Qt::Key_Space: + wireframe = !wireframe; + break; + default: + break; + } + + if (keys & 1) mv = mv - Vector3D::j; + if (keys & 2) mv = mv - Vector3D::i; + if (keys & 4) mv = mv + Vector3D::j; + if (keys & 8) mv = mv + Vector3D::i; + + camera.move(mv); + updateGL(); +} + +void Stage::keyReleaseEvent (QKeyEvent* event) { + switch (event->key()) { + case Qt::Key_A: + //mv = mv - Vector3D::j; + keys &= ~1; + break; + case Qt::Key_W: + //mv = mv - Vector3D::i; + keys &= ~2; + break; + case Qt::Key_D: + //mv = mv + Vector3D::j; + keys &= ~4; + break; + case Qt::Key_S: + //mv = mv + Vector3D::i; + keys &= ~8; + break; + default: + break; + } +} } |