diff options
author | Jakob Odersky <jodersky@gmail.com> | 2011-04-16 16:12:04 +0000 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2011-04-16 16:12:04 +0000 |
commit | 4e157e9aad9907807e6b9ae30a5d2f35cf643c15 (patch) | |
tree | 7ee4d1f6fab5bc23382ebf215be722af15817a63 | |
parent | 269a25fce9fcf3da10bbe420f81e2bf3a4de01ab (diff) | |
download | vhc-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.cc | 18 | ||||
-rw-r--r-- | src/gui/ElementRenderer.h | 15 | ||||
-rw-r--r-- | src/gui/Main.cc | 2 | ||||
-rw-r--r-- | src/gui/Makefile | 10 | ||||
-rw-r--r-- | src/gui/ParticleRenderer.h | 3 | ||||
-rw-r--r-- | src/gui/Renderer.h | 24 | ||||
-rw-r--r-- | src/gui/Stage.cc | 46 | ||||
-rw-r--r-- | src/gui/Stage.h | 3 | ||||
-rw-r--r-- | src/gui/gui.pro | 2 | ||||
-rw-r--r-- | src/main/CompositeElement.h | 2 | ||||
-rw-r--r-- | src/main/Dipole.h | 2 | ||||
-rw-r--r-- | src/main/Element.h | 2 | ||||
-rw-r--r-- | src/main/ElementVisitor.h | 6 | ||||
-rw-r--r-- | src/main/Quadrupole.h | 2 | ||||
-rw-r--r-- | src/main/StraightElement.h | 2 |
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());} |