summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2011-04-16 16:12:04 +0000
committerJakob Odersky <jodersky@gmail.com>2011-04-16 16:12:04 +0000
commit4e157e9aad9907807e6b9ae30a5d2f35cf643c15 (patch)
tree7ee4d1f6fab5bc23382ebf215be722af15817a63
parent269a25fce9fcf3da10bbe420f81e2bf3a4de01ab (diff)
downloadvhc-4e157e9aad9907807e6b9ae30a5d2f35cf643c15.tar.gz
vhc-4e157e9aad9907807e6b9ae30a5d2f35cf643c15.tar.bz2
vhc-4e157e9aad9907807e6b9ae30a5d2f35cf643c15.zip
Ajoute une classe abstraite 'Renderer' pour dessiner tout objet. Par consequent j'ai remarque une erreur de const-correctness dans le visitor pattern. J'ai donc modifie celui-ci, c'est a dire un visiteur ne peut pas changer un element (pas d'appel a des methodes non-const) ni etre change par un element.
-rw-r--r--src/gui/ElementRenderer.cc18
-rw-r--r--src/gui/ElementRenderer.h15
-rw-r--r--src/gui/Main.cc2
-rw-r--r--src/gui/Makefile10
-rw-r--r--src/gui/ParticleRenderer.h3
-rw-r--r--src/gui/Renderer.h24
-rw-r--r--src/gui/Stage.cc46
-rw-r--r--src/gui/Stage.h3
-rw-r--r--src/gui/gui.pro2
-rw-r--r--src/main/CompositeElement.h2
-rw-r--r--src/main/Dipole.h2
-rw-r--r--src/main/Element.h2
-rw-r--r--src/main/ElementVisitor.h6
-rw-r--r--src/main/Quadrupole.h2
-rw-r--r--src/main/StraightElement.h2
15 files changed, 98 insertions, 41 deletions
diff --git a/src/gui/ElementRenderer.cc b/src/gui/ElementRenderer.cc
index 14d7fc6..5066a5d 100644
--- a/src/gui/ElementRenderer.cc
+++ b/src/gui/ElementRenderer.cc
@@ -5,11 +5,9 @@
* Author: jakob
*/
-#include <iostream>
#include <QtOpenGL>
#include <math.h>
#include "ElementRenderer.h"
-#include "CurvedElement.h"
#include "StraightElement.h"
#include "Dipole.h"
#include "Quadrupole.h"
@@ -21,14 +19,17 @@
namespace vhc {
ElementRenderer::ElementRenderer() {
-
}
ElementRenderer::~ElementRenderer() {
}
-void ElementRenderer::drawStraight(StraightElement* straight) {
+void ElementRenderer::render(const Element& element) const {
+ element.accept(*this);
+}
+
+void ElementRenderer::drawStraight(const StraightElement* straight) const {
glPushMatrix();
glTranslated(straight->getEntryPosition().getX(), straight->getEntryPosition().getY(), straight->getEntryPosition().getZ());
Vector3D axis = Vector3D::k.cross(straight->getDiagonal());
@@ -44,12 +45,12 @@ void ElementRenderer::drawStraight(StraightElement* straight) {
}
-void ElementRenderer::visit(StraightElement* straight) {
+void ElementRenderer::visit(const StraightElement* straight) const {
glColor4d(0.4, 0.4, 0.4, 0.9);
drawStraight(straight);
}
-void ElementRenderer::visit(Quadrupole* quadrupole) {
+void ElementRenderer::visit(const Quadrupole* quadrupole) const {
if (quadrupole->getFocusingCoefficient() > 1)
glColor4d(0.4, 0, 0, 0.9);
else
@@ -58,7 +59,7 @@ void ElementRenderer::visit(Quadrupole* quadrupole) {
}
-void ElementRenderer::visit(Dipole* dipole) {
+void ElementRenderer::visit(const Dipole* dipole) const {
glColor4d(0.2, 0, 0.4, 0.9);
glPushMatrix();
glTranslated(dipole->getCurvatureCenter().getX(), dipole->getCurvatureCenter().getY(), dipole->getCurvatureCenter().getZ());
@@ -66,9 +67,6 @@ void ElementRenderer::visit(Dipole* dipole) {
Vector3D axis = Vector3D::i.cross(d);
double angle = asin(axis.norm() / d.norm());
- std::cout << "axis: " << axis << "\n";
- std::cout << "angle: " << angle * 180 / M_PI << "\n";
- std::cout << "for element " << *dipole << "\n";
if (d != -Vector3D::i)
glRotated(angle * 180 / M_PI, axis.getX(), axis.getY(), axis.getZ());
else
diff --git a/src/gui/ElementRenderer.h b/src/gui/ElementRenderer.h
index bbac319..c72ff69 100644
--- a/src/gui/ElementRenderer.h
+++ b/src/gui/ElementRenderer.h
@@ -8,19 +8,20 @@
#ifndef ELEMENTRENDERER_H_
#define ELEMENTRENDERER_H_
-#include <stdlib.h>
+#include "Renderer.h"
#include "ElementVisitor.h"
+#include "Element.h"
namespace vhc {
-class ElementRenderer: public ElementVisitor {
+class ElementRenderer: public ElementVisitor, public Renderer<Element> {
private:
static const int SLICES = 100;
static const int STACKS_PER_LENGTH = 20;
- void drawStraight(StraightElement* straight);
+ void drawStraight(const StraightElement* straight) const;
public:
@@ -28,11 +29,13 @@ public:
virtual ~ElementRenderer();
- virtual void visit(StraightElement* straight);
+ virtual void render(const Element& element) const;
- virtual void visit(Quadrupole* quadrupole);
+ virtual void visit(const StraightElement* straight) const ;
- virtual void visit(Dipole* dipole);
+ virtual void visit(const Quadrupole* quadrupole) const;
+
+ virtual void visit(const Dipole* dipole) const;
};
diff --git a/src/gui/Main.cc b/src/gui/Main.cc
index ac9e7a5..003960f 100644
--- a/src/gui/Main.cc
+++ b/src/gui/Main.cc
@@ -70,7 +70,7 @@ int main(int argc, char *argv[])
vhc::Stage window;
window.accelerator = &acc;
- window.showFullScreen();
+ // window.showFullScreen();
//window.resize(QSize(500, 500));
window.setWindowTitle("Virtual Hadron Collider");
diff --git a/src/gui/Makefile b/src/gui/Makefile
index 2b3b256..1f6658e 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: Fri Apr 15 17:44:57 2011
+# Generated by qmake (2.01a) (Qt 4.7.0) on: Sat Apr 16 18:07:54 2011
# Project: gui.pro
# Template: app
# Command: /usr/bin/qmake -o Makefile gui.pro
@@ -166,7 +166,7 @@ qmake: FORCE
dist:
@$(CHK_DIR_EXISTS) $(BINDIR)/gui/gui1.0.0 || $(MKDIR) $(BINDIR)/gui/gui1.0.0
- $(COPY_FILE) --parents $(SOURCES) $(DIST) $(BINDIR)/gui/gui1.0.0/ && $(COPY_FILE) --parents GLWidget.h Camera.h ElementRenderer.h util.h Stage.h ParticleRenderer.h $(BINDIR)/gui/gui1.0.0/ && $(COPY_FILE) --parents Main.cc GLWidget.cc ElementRenderer.cc util.cc Stage.cc ParticleRenderer.cc $(BINDIR)/gui/gui1.0.0/ && (cd `dirname $(BINDIR)/gui/gui1.0.0` && $(TAR) gui1.0.0.tar gui1.0.0 && $(COMPRESS) gui1.0.0.tar) && $(MOVE) `dirname $(BINDIR)/gui/gui1.0.0`/gui1.0.0.tar.gz . && $(DEL_FILE) -r $(BINDIR)/gui/gui1.0.0
+ $(COPY_FILE) --parents $(SOURCES) $(DIST) $(BINDIR)/gui/gui1.0.0/ && $(COPY_FILE) --parents GLWidget.h Camera.h ElementRenderer.h util.h Stage.h ParticleRenderer.h Renderer.h $(BINDIR)/gui/gui1.0.0/ && $(COPY_FILE) --parents Main.cc GLWidget.cc ElementRenderer.cc util.cc Stage.cc ParticleRenderer.cc $(BINDIR)/gui/gui1.0.0/ && (cd `dirname $(BINDIR)/gui/gui1.0.0` && $(TAR) gui1.0.0.tar gui1.0.0 && $(COMPRESS) gui1.0.0.tar) && $(MOVE) `dirname $(BINDIR)/gui/gui1.0.0`/gui1.0.0.tar.gz . && $(DEL_FILE) -r $(BINDIR)/gui/gui1.0.0
clean:compiler_clean
@@ -196,6 +196,7 @@ moc_GLWidget.cpp: Camera.h \
moc_Stage.cpp: Camera.h \
ElementRenderer.h \
+ Renderer.h \
ParticleRenderer.h \
Stage.h
/usr/bin/moc-qt4 $(DEFINES) $(INCPATH) Stage.h -o moc_Stage.cpp
@@ -223,16 +224,19 @@ $(BINDIR)/gui/Main.o: Main.cc GLWidget.h \
Camera.h \
Stage.h \
ElementRenderer.h \
+ Renderer.h \
ParticleRenderer.h
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $(BINDIR)/gui/Main.o Main.cc
$(BINDIR)/gui/GLWidget.o: GLWidget.cc GLWidget.h \
Camera.h \
ElementRenderer.h \
+ Renderer.h \
util.h
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $(BINDIR)/gui/GLWidget.o GLWidget.cc
$(BINDIR)/gui/ElementRenderer.o: ElementRenderer.cc ElementRenderer.h \
+ Renderer.h \
util.h
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $(BINDIR)/gui/ElementRenderer.o ElementRenderer.cc
@@ -243,10 +247,12 @@ $(BINDIR)/gui/Stage.o: Stage.cc util.h \
Stage.h \
Camera.h \
ElementRenderer.h \
+ Renderer.h \
ParticleRenderer.h
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $(BINDIR)/gui/Stage.o Stage.cc
$(BINDIR)/gui/ParticleRenderer.o: ParticleRenderer.cc ParticleRenderer.h \
+ Renderer.h \
util.h
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $(BINDIR)/gui/ParticleRenderer.o ParticleRenderer.cc
diff --git a/src/gui/ParticleRenderer.h b/src/gui/ParticleRenderer.h
index e44f67b..c1c71b0 100644
--- a/src/gui/ParticleRenderer.h
+++ b/src/gui/ParticleRenderer.h
@@ -8,11 +8,12 @@
#ifndef PARTICLERENDERER_H_
#define PARTICLERENDERER_H_
+#include "Renderer.h"
#include "Particle.h"
namespace vhc {
-class ParticleRenderer {
+class ParticleRenderer: public Renderer<Particle> {
public:
ParticleRenderer();
virtual ~ParticleRenderer();
diff --git a/src/gui/Renderer.h b/src/gui/Renderer.h
new file mode 100644
index 0000000..a673957
--- /dev/null
+++ b/src/gui/Renderer.h
@@ -0,0 +1,24 @@
+/*
+ * Renderer.h
+ *
+ * Created on: Apr 16, 2011
+ * Author: jakob
+ */
+
+#ifndef RENDERER_H_
+#define RENDERER_H_
+
+namespace vhc {
+
+template <typename T>
+class Renderer {
+public:
+ Renderer() {};
+ virtual ~Renderer() {};
+
+ virtual void render(const T& item) const = 0;
+};
+
+}
+
+#endif /* RENDERER_H_ */
diff --git a/src/gui/Stage.cc b/src/gui/Stage.cc
index d9c3541..6b5ec4a 100644
--- a/src/gui/Stage.cc
+++ b/src/gui/Stage.cc
@@ -12,12 +12,27 @@ using namespace vhc::util;
namespace vhc {
-Stage::Stage(QWidget* parent): QGLWidget (parent), accelerator(NULL), camera(), elementRenderer(new ElementRenderer), particleRenderer(), displayMode(FILL), keys(0) {
+Stage::Stage(QWidget* parent):
+ QGLWidget (parent),
+ accelerator(NULL),
+ camera(),
+ elementRenderer(new ElementRenderer),
+ particleRenderer(),
+ displayMode(FILL),
+ keys(0) {
+
+ timer = new QTimer(this);
+
+
+ connect(timer, SIGNAL(timeout()), this, SLOT(foo()));
+ timer->start(1);
+
setMouseTracking(true);
}
Stage::~Stage() {
delete elementRenderer; elementRenderer = NULL;
+ delete timer; timer = NULL;
};
void Stage::initializeGL () {
@@ -99,7 +114,7 @@ void Stage::mouseMoveEvent(QMouseEvent* event) {
int dpitch = -QCursor::pos().y() + center.y();
camera.addHeading(1.0 * dheading / 200);
camera.addPitch(1.0 * dpitch / 200);
- updateGL();
+ update();
}
void Stage::keyPressEvent (QKeyEvent* event) {
@@ -109,21 +124,23 @@ void Stage::keyPressEvent (QKeyEvent* event) {
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_PageUp:
+ keys |= 16;
+ break;
+ case Qt::Key_PageDown:
+ keys |= 32;
+ break;
case Qt::Key_Up:
camera.addPitch(2 * M_PI / 100);
break;
@@ -155,29 +172,34 @@ void Stage::keyPressEvent (QKeyEvent* event) {
if (keys & 2) mv = mv - 0.1 * Vector3D::i;
if (keys & 4) mv = mv + 0.1 * Vector3D::j;
if (keys & 8) mv = mv + 0.1 * Vector3D::i;
-
+ if (keys & 16) mv = mv + 0.1 * Vector3D::k;
+ if (keys & 32) mv = mv - 0.1 * Vector3D::k;
camera.move(mv);
- updateGL();
+
+
+ update();
}
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;
+ case Qt::Key_PageUp:
+ keys &= ~16;
+ break;
+ case Qt::Key_PageDown:
+ keys &= ~32;
+ break;
default:
break;
}
diff --git a/src/gui/Stage.h b/src/gui/Stage.h
index b37a55b..6c338fc 100644
--- a/src/gui/Stage.h
+++ b/src/gui/Stage.h
@@ -31,6 +31,7 @@ class Stage: public QGLWidget {
Q_OBJECT
public:
+
Stage(QWidget* parent = NULL);
virtual ~Stage();
@@ -51,7 +52,9 @@ protected:
private:
+
Camera camera;
+ QTimer* timer;
ElementRenderer* elementRenderer;
ParticleRenderer particleRenderer;
diff --git a/src/gui/gui.pro b/src/gui/gui.pro
index 495b5ef..f82297f 100644
--- a/src/gui/gui.pro
+++ b/src/gui/gui.pro
@@ -10,5 +10,5 @@ LIBS += -L$(BINDIR)/main -lvhc
QT += opengl
# Input
-HEADERS += GLWidget.h Camera.h ElementRenderer.h util.h Stage.h ParticleRenderer.h
+HEADERS += GLWidget.h Camera.h ElementRenderer.h util.h Stage.h ParticleRenderer.h Renderer.h
SOURCES += Main.cc GLWidget.cc Camera.h ElementRenderer.cc util.cc Stage.cc ParticleRenderer.cc
diff --git a/src/main/CompositeElement.h b/src/main/CompositeElement.h
index 2c0c6d4..638e74a 100644
--- a/src/main/CompositeElement.h
+++ b/src/main/CompositeElement.h
@@ -54,7 +54,7 @@ public:
return e;
}
- virtual void accept(ElementVisitor& v) {
+ virtual void accept(const ElementVisitor& v) const {
for (int i(0); i < elements.size(); ++i) {
elements[i]->accept(v);
}
diff --git a/src/main/Dipole.h b/src/main/Dipole.h
index 6edfb91..a455b36 100644
--- a/src/main/Dipole.h
+++ b/src/main/Dipole.h
@@ -65,7 +65,7 @@ public:
return s.str();
}
- virtual void accept(ElementVisitor& v) {v.visit(this);}
+ virtual void accept(const ElementVisitor& v) const {v.visit(this);}
virtual Dipole* clone() const {
return new Dipole(getEntryPosition(), getExitPosition(), getSectionRadius(), getCurvature(), _magneticField);
diff --git a/src/main/Element.h b/src/main/Element.h
index 4ce1d00..32ba2db 100644
--- a/src/main/Element.h
+++ b/src/main/Element.h
@@ -134,7 +134,7 @@ public:
return s.str();
}
- virtual void accept(ElementVisitor& v) = 0;
+ virtual void accept(const ElementVisitor& v) const = 0;
};
}
diff --git a/src/main/ElementVisitor.h b/src/main/ElementVisitor.h
index cf14aca..89de7d7 100644
--- a/src/main/ElementVisitor.h
+++ b/src/main/ElementVisitor.h
@@ -30,11 +30,11 @@ public:
ElementVisitor();
virtual ~ElementVisitor();
- virtual void visit(StraightElement* straight) = 0;
+ virtual void visit(const StraightElement* straight) const = 0;
- virtual void visit(Quadrupole* quadrupole) = 0;
+ virtual void visit(const Quadrupole* quadrupole) const = 0;
- virtual void visit(Dipole* dipole) = 0;
+ virtual void visit(const Dipole* dipole) const = 0;
};
}
diff --git a/src/main/Quadrupole.h b/src/main/Quadrupole.h
index 1f4903b..32eac23 100644
--- a/src/main/Quadrupole.h
+++ b/src/main/Quadrupole.h
@@ -46,7 +46,7 @@ public:
virtual std::string getType() const {return "Quadrupole";}
- virtual void accept(ElementVisitor& v) {v.visit(this);}
+ virtual void accept(const ElementVisitor& v) const {v.visit(this);}
virtual Quadrupole* clone() const {return new Quadrupole(getEntryPosition(), getExitPosition(), getSectionRadius(), focusingCoefficient);}
};
diff --git a/src/main/StraightElement.h b/src/main/StraightElement.h
index 3a7fcf4..dc7603b 100644
--- a/src/main/StraightElement.h
+++ b/src/main/StraightElement.h
@@ -46,7 +46,7 @@ public:
return s.str();
}
- virtual void accept(ElementVisitor& v) {v.visit(this);}
+ virtual void accept(const ElementVisitor& v) const {v.visit(this);}
virtual StraightElement* clone() const {return new StraightElement(getEntryPosition(), getExitPosition(), getSectionRadius());}