// This code example is created for educational purpose // by Thorsten Thormaehlen (contact: www.thormae.de). // It is distributed without any warranty. #include #include #include #include #include #include #include class Renderer : protected QOpenGLFunctions_2_0 { public: float t; public: Renderer() : t(0.0), width(0), height(0) {} public: void display() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // top right viewport (look from front) glViewport(width/2, height/2, width/2, height/2); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); drawFrame(); // set camera (look from positive x-direction) gluLookAt(10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0); // draw scene drawSceneGrid(); drawRotatingPyramid(); // bottom left viewport (look from left) glViewport(0, 0, width/2, height/2); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); drawFrame(); // set camera (look from negative y-direction) gluLookAt(0.0, -10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0); // draw scene drawSceneGrid(); drawRotatingPyramid(); // top left viewport (look from top) glViewport(0, height/2, width/2, height/2); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); drawFrame(); // set camera (look from positive z-direction) gluLookAt(0.0, 0.0, 10.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0); // draw scene drawSceneGrid(); drawRotatingPyramid(); // bottom right viewport (perspective) glViewport(width/2, 0, width/2, height/2); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); drawFrame(); // set camera gluLookAt(8.0, -2.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0); // draw scene drawSceneGrid(); drawRotatingPyramid(); } void init() { initializeOpenGLFunctions(); glEnable(GL_DEPTH_TEST); //glEnable(GL_CULL_FACE); } void resize(int w, int h) { width = w; height = h; glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective (30.0, (float)width/(float)height, 2.0, 20.0); } void dispose() { } private: int width; int height; private: void drawFrame() { glLineWidth(2.0f); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glColor3f(1.0f, 1.0f, 1.0f); glBegin(GL_LINE_LOOP); glVertex3f(-1.0f, 1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 0.0f); glVertex3f( 1.0f,-1.0f, 0.0f); glVertex3f(-1.0f,-1.0f, 0.0f); glEnd(); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glLineWidth(1.0f); } void drawSceneGrid() { glColor3f(0.3f, 0.3f, 0.3f); glBegin(GL_LINES); for(unsigned i=0; i<=10; i++) { glVertex3f(-5.0f+i, -5.0f, 0.0f); glVertex3f(-5.0f+i, 5.0f, 0.0f); glVertex3f(-5.0f, -5.0f+i, 0.0f); glVertex3f( 5.0f, -5.0f+i, 0.0f); } glEnd(); glColor3f(0.0f, 0.0f, 1.0f); drawCoordinateAxisZ(); glColor3f(0.0f, 1.0f, 0.0f); drawCoordinateAxisY(); glColor3f(1.0f, 0.0f, 0.0f); drawCoordinateAxisX(); } void drawCoordinateAxisZ() { glLineWidth(2.0f); glBegin(GL_LINES); glVertex3f(0.0f, 0.0f, 0.0f); // z-axis glVertex3f(0.0f, 0.0f, 2.0f); glEnd(); glLineWidth(1.0f); // z-axis tip glBegin(GL_TRIANGLES); glVertex3f( 0.0f, 0.0f, 2.0f); glVertex3f(-0.05f, 0.05f, 1.9f); glVertex3f( 0.05f, 0.05f, 1.9f); glVertex3f( 0.0f, 0.0f, 2.0f); glVertex3f( 0.05f, -0.05f, 1.9f); glVertex3f(-0.05f, -0.05f, 1.9f); glVertex3f( 0.0f, 0.0f, 2.0f); glVertex3f( 0.05f, 0.05f, 1.9f); glVertex3f( 0.05f, -0.05f, 1.9f); glVertex3f( 0.0f, 0.0f, 2.0f); glVertex3f(-0.05f, -0.05f, 1.9f); glVertex3f(-0.05f, 0.05f, 1.9f); glEnd(); glBegin(GL_POLYGON); glVertex3f( 0.05f, -0.05f, 1.9f); glVertex3f( 0.05f, 0.05f, 1.9f); glVertex3f(-0.05f, 0.05f, 1.9f); glVertex3f(-0.05f, -0.05f, 1.9f); glEnd(); } void drawCoordinateAxisX() { glPushMatrix(); glRotatef(90.0f, 0.0f, 1.0f, 0.0f); drawCoordinateAxisZ(); glPopMatrix(); } void drawCoordinateAxisY() { glPushMatrix(); glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); drawCoordinateAxisZ(); glPopMatrix(); } void drawRotatingPyramid() { glRotatef(t, 0.0f, 0.0f, 1.0f); drawPyramid(); } void drawPyramid() { glColor3f(1.0f,0.0f,0.0f); glBegin(GL_TRIANGLES); glVertex3f( 0.0f, 0.0f, 1.5f); glVertex3f(-1.0f, 1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 0.0f); glEnd(); glColor3f(0.0f,1.0f,0.0f); glBegin(GL_TRIANGLES); glVertex3f( 0.0f, 0.0f, 1.5f); glVertex3f( 1.0f, -1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glEnd(); glColor3f(0.0f,0.0f,1.0f); glBegin(GL_TRIANGLES); glVertex3f( 0.0f, 0.0f, 1.5f); glVertex3f( 1.0f, 1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 0.0f); glEnd(); glColor3f(1.0f,1.0f,0.0f); glBegin(GL_TRIANGLES); glVertex3f( 0.0f, 0.0f, 1.5f); glVertex3f(-1.0f, -1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 0.0f); glEnd(); glColor3f(0.0f,1.0f,1.0f); glBegin(GL_POLYGON); glVertex3f( 1.0f, -1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glEnd(); } }; class MyWidget : public QOpenGLWidget { private: Renderer *renderer; QTimer *timer; public: MyWidget(QWidget *parent = NULL) : QOpenGLWidget(parent) { this->setWindowTitle("glViewport Demo"); this->resize(320, 320); renderer = new Renderer(); timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(update())); timer->start(30); } ~MyWidget() { makeCurrent(); renderer->dispose(); doneCurrent(); delete renderer; delete timer; } protected: void initializeGL() { renderer->init(); } void resizeGL(int w, int h){ renderer->resize(w, h); } void paintGL() { float offset = 1.0f; renderer->t += offset; renderer->display(); } }; int main (int argc, char* argv[]) { // create a QApplication object that handles initialization, // finalization, and the main event loop QApplication appl(argc, argv); MyWidget widget; // create a widget widget.show(); //show the widget and its children return appl.exec(); // execute the application }