summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2011-04-13 00:10:05 +0000
committerJakob Odersky <jodersky@gmail.com>2011-04-13 00:10:05 +0000
commitd4c30f04e6b84df2d88841f1544d16ef9973ffb1 (patch)
tree1dbd125be32ccf0929c1af9a6b5547687e52013e
parent12c329da1549af51724b487cc6ae5127934e6cff (diff)
downloadvhc-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.h3
-rw-r--r--src/gui/Main.cc22
-rw-r--r--src/gui/Makefile13
-rw-r--r--src/gui/ParticleRenderer.cc16
-rw-r--r--src/gui/ParticleRenderer.h3
-rw-r--r--src/gui/Stage.cc134
-rw-r--r--src/gui/Stage.h19
-rw-r--r--src/gui/util.cc10
-rw-r--r--src/gui/util.h2
-rw-r--r--src/main/Accelerator.h12
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) {