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 | |
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.
-rw-r--r-- | src/gui/Camera.h | 3 | ||||
-rw-r--r-- | src/gui/Main.cc | 22 | ||||
-rw-r--r-- | src/gui/Makefile | 13 | ||||
-rw-r--r-- | src/gui/ParticleRenderer.cc | 16 | ||||
-rw-r--r-- | src/gui/ParticleRenderer.h | 3 | ||||
-rw-r--r-- | src/gui/Stage.cc | 134 | ||||
-rw-r--r-- | src/gui/Stage.h | 19 | ||||
-rw-r--r-- | src/gui/util.cc | 10 | ||||
-rw-r--r-- | src/gui/util.h | 2 | ||||
-rw-r--r-- | src/main/Accelerator.h | 12 |
10 files changed, 208 insertions, 26 deletions
diff --git a/src/gui/Camera.h b/src/gui/Camera.h index 7c469aa..109bef9 100644 --- a/src/gui/Camera.h +++ b/src/gui/Camera.h @@ -24,7 +24,6 @@ private: double heading; //left/right double pitch; //up/down - public: Camera(): position(1, 1, 1), direction(-1, 0, 0), up(0,0,1), heading(M_PI_4), pitch(-M_PI_4) {}; @@ -45,6 +44,8 @@ public: void addPitch(double h) { pitch += h; + if (pitch <= -M_PI_2) pitch = -M_PI_2 + 0.001; + if (pitch >= M_PI_2) pitch = M_PI_2 - 0.001; } diff --git a/src/gui/Main.cc b/src/gui/Main.cc index 56974b7..c96b8f4 100644 --- a/src/gui/Main.cc +++ b/src/gui/Main.cc @@ -8,6 +8,11 @@ #include <QApplication> #include <QWidget> #include "GLWidget.h" +#include "Stage.h" +#include "Accelerator.h" +#include "StraightElement.h" +#include "Dipole.h" +#include "Particle.h" #include "Vector3D.h" @@ -15,10 +20,23 @@ int main(int argc, char *argv[]) { QApplication app(argc, argv); - GLWidget window; + //GLWidget window; + vhc::Accelerator accelerator; + vhc::StraightElement se = vhc::StraightElement(vhc::Vector3D::j, vhc::Vector3D::j + vhc::Vector3D::i, 0.2); + vhc::StraightElement se2 = vhc::StraightElement(vhc::Vector3D(2,0,0), vhc::Vector3D(2,-1,0), 0.2); + vhc::CurvedElement* ce = new vhc::Dipole(vhc::Vector3D(1,1,0), vhc::Vector3D::i * 2, 0.2, 1, vhc::Vector3D::Null); + accelerator.add(se); + accelerator.add(se2); + accelerator.add(*ce); + + vhc::Particle p(se.getEntryPosition(), 1, 1); + accelerator.add(p); + + vhc::Stage window; + window.accelerator = &accelerator; window.showFullScreen(); -// window.resize(QSize(500, 500)); + //window.resize(QSize(500, 500)); window.setWindowTitle("Virtual Hadron Collider"); window.show(); diff --git a/src/gui/Makefile b/src/gui/Makefile index a49aa1a..738ae07 100644 --- a/src/gui/Makefile +++ b/src/gui/Makefile @@ -1,6 +1,6 @@ ############################################################################# # Makefile for building: $(BINDIR)/gui/gui -# Generated by qmake (2.01a) (Qt 4.7.0) on: Tue Apr 12 23:39:22 2011 +# Generated by qmake (2.01a) (Qt 4.7.0) on: Wed Apr 13 02:07:35 2011 # Project: gui.pro # Template: app # Command: /usr/bin/qmake -o Makefile gui.pro @@ -220,7 +220,10 @@ compiler_clean: compiler_moc_header_clean ####### Compile $(BINDIR)/gui/Main.o: Main.cc GLWidget.h \ - Camera.h + Camera.h \ + Stage.h \ + ElementRenderer.h \ + ParticleRenderer.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $(BINDIR)/gui/Main.o Main.cc $(BINDIR)/gui/GLWidget.o: GLWidget.cc GLWidget.h \ @@ -236,13 +239,15 @@ $(BINDIR)/gui/ElementRenderer.o: ElementRenderer.cc ElementRenderer.h \ $(BINDIR)/gui/util.o: util.cc $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $(BINDIR)/gui/util.o util.cc -$(BINDIR)/gui/Stage.o: Stage.cc Stage.h \ +$(BINDIR)/gui/Stage.o: Stage.cc util.h \ + Stage.h \ Camera.h \ ElementRenderer.h \ ParticleRenderer.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $(BINDIR)/gui/Stage.o Stage.cc -$(BINDIR)/gui/ParticleRenderer.o: ParticleRenderer.cc ParticleRenderer.h +$(BINDIR)/gui/ParticleRenderer.o: ParticleRenderer.cc ParticleRenderer.h \ + util.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $(BINDIR)/gui/ParticleRenderer.o ParticleRenderer.cc $(BINDIR)/gui/moc_GLWidget.o: moc_GLWidget.cpp diff --git a/src/gui/ParticleRenderer.cc b/src/gui/ParticleRenderer.cc index 48742bc..38736c7 100644 --- a/src/gui/ParticleRenderer.cc +++ b/src/gui/ParticleRenderer.cc @@ -5,17 +5,29 @@ * Author: jakob */ +#include <QtOpenGL> #include "ParticleRenderer.h" +#include "util.h" namespace vhc { ParticleRenderer::ParticleRenderer() { - // TODO Auto-generated constructor stub + //Auto-generated constructor stub } ParticleRenderer::~ParticleRenderer() { - // TODO Auto-generated destructor stub + //Auto-generated destructor stub +} + +void ParticleRenderer::render(const Particle& particle) const { + glPushMatrix(); + glTranslated(particle.getPosition().getX(), particle.getPosition().getY(), particle.getPosition().getZ()); + glBegin(GL_POINTS); + //glVertex3d(0, 0, 0); + util::sphere(0.01); + glEnd(); + glPopMatrix(); } } diff --git a/src/gui/ParticleRenderer.h b/src/gui/ParticleRenderer.h index 984f2e1..e44f67b 100644 --- a/src/gui/ParticleRenderer.h +++ b/src/gui/ParticleRenderer.h @@ -8,12 +8,15 @@ #ifndef PARTICLERENDERER_H_ #define PARTICLERENDERER_H_ +#include "Particle.h" + namespace vhc { class ParticleRenderer { public: ParticleRenderer(); virtual ~ParticleRenderer(); + void render(const Particle& particle) const; }; } 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; + } +} } diff --git a/src/gui/Stage.h b/src/gui/Stage.h index 5e0a834..66bdc03 100644 --- a/src/gui/Stage.h +++ b/src/gui/Stage.h @@ -15,6 +15,7 @@ #include "ElementRenderer.h" #include "ParticleRenderer.h" #include "Element.h" +#include "Accelerator.h" namespace vhc { @@ -24,31 +25,35 @@ class Stage: public QGLWidget { Q_OBJECT public: - Stage(QWidget* parent); + Stage(QWidget* parent = NULL); virtual ~Stage(); + //TODO !!! temporary + Accelerator* accelerator; + protected: void initializeGL(); void resizeGL (int width, int height); - //void paintGL(); + void paintGL(); //void mousePressEvent (QMouseEvent* event); //void mouseReleaseEvent (QMouseEvent* event); - //void keyPressEvent (QKeyEvent* event); - //void keyReleaseEvent (QKeyEvent* event); - //void mouseMoveEvent(QMouseEvent* event); + void keyPressEvent (QKeyEvent* event); + void keyReleaseEvent (QKeyEvent* event); + void mouseMoveEvent(QMouseEvent* event); private: - std::vector<Element*> elements; - Camera camera; ElementRenderer* elementRenderer; ParticleRenderer particleRenderer; bool wireframe; + int keys; + QPoint center; + }; diff --git a/src/gui/util.cc b/src/gui/util.cc index 1efac67..8ca463e 100644 --- a/src/gui/util.cc +++ b/src/gui/util.cc @@ -24,10 +24,6 @@ void torus(double R, double r, double fraction, int slices, int stacks) { x = (R+r*cos(s*twopi/slices))*cos(t*twopi/stacks); y = (R+r*cos(s*twopi/slices))*sin(t*twopi/stacks); z = r * sin(s * twopi / slices); - double b = (rand() % 100) / 100.0; - bool white = (rand() % 3) == 0; - if (white) glColor3d(1, 1, 1); - else glColor3d(b, (rand() % 100) / 100.0, 1); glVertex3d(x, y, z); } } @@ -41,6 +37,12 @@ void cylinder(double base, double top, double height, int slices, int stacks) { gluDeleteQuadric(q); } +void sphere(double radius, int slices, int stacks) { + GLUquadric* q = gluNewQuadric(); + gluSphere(q, radius, slices, stacks); + gluDeleteQuadric(q); +} + void axes() { glBegin(GL_LINES); glColor3d(1, 0, 0); diff --git a/src/gui/util.h b/src/gui/util.h index 6238ab7..e83b4d9 100644 --- a/src/gui/util.h +++ b/src/gui/util.h @@ -22,6 +22,8 @@ void torus(double R, double r, double fraction, int slices = 12, int stacks = 20 void cylinder(double base, double top, double height, int slices = 12, int stacks = 20); +void sphere(double radius, int slices = 12, int stacks = 20); + /** Dessine les axes unitaires d'un repere cartesien. * Les axes ont les couleurs suivantes: x -> rouge, y -> vert, z -> bleu */ void axes(); diff --git a/src/main/Accelerator.h b/src/main/Accelerator.h index e0b99bc..c8f57ca 100644 --- a/src/main/Accelerator.h +++ b/src/main/Accelerator.h @@ -66,19 +66,27 @@ public: /** Efface tous les éléments et les particules. */ void clear() { - for (int i = 0; i < particleCollec.size(); ++i) { + for (unsigned int i = 0; i < particleCollec.size(); ++i) { delete particleCollec[i]; particleCollec[i] = NULL; } particleCollec.clear(); - for (int i = 0; i < elementCollec.size(); ++i) { + for (unsigned int i = 0; i < elementCollec.size(); ++i) { delete elementCollec[i]; elementCollec[i] = NULL; } elementCollec.clear(); } + const std::vector< Element* >& getElements() const { + return elementCollec; + } + + const std::vector< Particle* >& getParticles() const { + return particleCollec; + } + /** Fait évoluer l'accélérateur d'un lapse de temps dt . */ void step(double dt) { |