From b1474cb085eab4b23d951b1716b67e0c4bfd55c5 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sun, 7 Feb 2010 13:50:05 +0000 Subject: [PATCH] Render tree to display list --- include/OpenGLHelper.hpp | 1 + src/LTree.cpp | 35 +++++++++++++++++++++++++++++++++-- src/OpenGLHelper.cpp | 17 ++++++++++++----- 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/include/OpenGLHelper.hpp b/include/OpenGLHelper.hpp index 25375f9..84a24ed 100644 --- a/include/OpenGLHelper.hpp +++ b/include/OpenGLHelper.hpp @@ -31,6 +31,7 @@ void initGL(); void drawGLScene(IWindowPtr aWindow, IGraphicsPtr aContext, IScreenPtr aScreen); void resizeGLScene(IWindowPtr aWindow); void printGLVersion(); +void checkGLError(); // Wrappers for OpenGL picking features void beginPick(IWindowPtr aWindow, unsigned* aBuffer, int x, int y); diff --git a/src/LTree.cpp b/src/LTree.cpp index 92cd735..b06378f 100644 --- a/src/LTree.cpp +++ b/src/LTree.cpp @@ -125,6 +125,7 @@ using namespace lsystem; class LTree : public IScenery { public: LTree(); + ~LTree(); // IScenery interface void render() const; @@ -140,9 +141,12 @@ private: }; void interpret(Token t, RenderState& rs) const; + void renderToDisplayList() const; LSystem ls; Vector position; + + GLuint displayList; static const Rule rules[]; }; @@ -165,6 +169,14 @@ LTree::LTree() evolve(ls); //debug() << "n=" << n << ": " << ls; } + + displayList = glGenLists(1); + renderToDisplayList(); +} + +LTree::~LTree() +{ + glDeleteLists(displayList, 1); } void LTree::interpret(Token t, RenderState& rs) const @@ -220,11 +232,28 @@ void LTree::interpret(Token t, RenderState& rs) const void LTree::render() const { - using namespace placeholders; + glPushAttrib(GL_ENABLE_BIT); - glPushMatrix(); + glDisable(GL_BLEND); + glDisable(GL_TEXTURE_2D); + glPushMatrix(); + gl::translate(position); + glCallList(displayList); + + glPopMatrix(); + + glPopAttrib(); +} + +void LTree::renderToDisplayList() const +{ + using namespace placeholders; + + glNewList(displayList, GL_COMPILE); + + glPushMatrix(); gl::colour(makeRGB(159, 71, 17)); @@ -233,6 +262,8 @@ void LTree::render() const bind(<ree::interpret, this, _1, rs)); glPopMatrix(); + + glEndList(); } void LTree::setPosition(float x, float y, float z) diff --git a/src/OpenGLHelper.cpp b/src/OpenGLHelper.cpp index 628f311..273edb8 100644 --- a/src/OpenGLHelper.cpp +++ b/src/OpenGLHelper.cpp @@ -28,6 +28,17 @@ #include +void checkGLError() +{ + using namespace boost; + + GLenum error = glGetError(); + if (error != GL_NO_ERROR) { + throw runtime_error + ("OpenGL error: " + lexical_cast(gluErrorString(error))); + } +} + void drawGLScene(IWindowPtr aWindow, IGraphicsPtr aContext, IScreenPtr aScreen) { using namespace boost; @@ -80,11 +91,7 @@ void drawGLScene(IWindowPtr aWindow, IGraphicsPtr aContext, IScreenPtr aScreen) aScreen->overlay(); // Check for OpenGL errors - GLenum error = glGetError(); - if (error != GL_NO_ERROR) { - throw runtime_error - ("OpenGL error: " + lexical_cast(gluErrorString(error))); - } + checkGLError(); } // Report the current OpenGL version -- 2.39.2