libQGLViewer fastDraw example

Home Download Gallery Documentation Developer

# The fastDraw example

The `fastDraw()` function enables interactivity even with large scenes.

This example demonstrates the use of the `fastDraw()` function, which is called when the camera is manipulated. This function can be used to display a simplified version of the scene and is usefull for displaying very complex scene, while keeping an interactive camera motion.

## fastDraw.h

    #include <QGLViewer/qglviewer.h>

    class Viewer : public QGLViewer {
    protected:
      virtual void init();
      virtual void draw();
      virtual void fastDraw();
      virtual QString helpString() const;
    };

## fastDraw.cpp

    #include "fastDraw.h"

    using namespace std;
    using namespace qglviewer;

    void Viewer::init() {
      // Increase the material shininess, so that the difference between
      // the two versions of the spiral is more visible.
      glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 50.0);
      GLfloat specular_color[4] = {0.8f, 0.8f, 0.8f, 1.0};
      glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular_color);

      restoreStateFromFile();
      help();
    }

    static void drawSpiral(bool simplified = false) {
      int nbSteps = 600;
      int nbSub = 50;
      if (simplified) {
        nbSteps = 60;
        nbSub = 2;
      }

      for (float n = 0; n < nbSub; ++n) {
        glBegin(GL_QUAD_STRIP);
        for (float i = 0.0; i < nbSteps; ++i) {
          float ratio = i / nbSteps;
          float angle = 21.0 * ratio;
          float radius = 1.0 - 0.5 * ratio;

          Vec center(radius * cos(angle), ratio - 0.5, radius * sin(angle));

          for (unsigned short j = 0; j < 2; ++j) {
            float delta = 3.0 * (n + j) / nbSub;
            Vec shift(cos(angle) * cos(delta), sin(delta), sin(angle) * cos(delta));

            glColor3f(1 - ratio, (n + j) / nbSub, ratio);
            glNormal3fv(shift);
            glVertex3fv(center + 0.2f * shift);
          }
        }
        glEnd();
      }
    }

    void Viewer::draw() { drawSpiral(); }

    void Viewer::fastDraw() { drawSpiral(true); }

    QString Viewer::helpString() const {
      QString text("<h2>F a s t D r a w</h2>");
      text += "The <code>fastDraw()</code> function is called instead of "
              "<code>draw()</code> when the camera ";
      text += "is manipulated. Providing such a simplified version of "
              "<code>draw()</code> allows for interactive ";
      text += "frame rates when the camera is moved, even for very complex scenes.";
      return text;
    }

## main.cpp

    #include "fastDraw.h"
    #include <qapplication.h>

    int main(int argc, char **argv) {
      QApplication application(argc, argv);

      Viewer viewer;

      viewer.setWindowTitle("fastDraw");

      viewer.show();

      return application.exec();
    }

Back to the examples main page.