glbox.cpp Example File | Active Qt 5.6

Qt 5.6 | Active Qt | OpenGL Example (ActiveQt) | glbox.cpp Example File

Qt 5.6.2 Reference Documentation

# glbox.cpp Example File

activeqt/opengl/glbox.cpp

      /****************************************************************************
      **
      ** Copyright (C) 2015 The Qt Company Ltd.
      ** Contact: http://www.qt.io/licensing/
      **
      ** This file is part of the examples of the Qt Toolkit.
      **
      ** $QT_BEGIN_LICENSE:BSD$
      ** You may use this file under the terms of the BSD license as follows:
      **
      ** "Redistribution and use in source and binary forms, with or without
      ** modification, are permitted provided that the following conditions are
      ** met:
      **   * Redistributions of source code must retain the above copyright
      **     notice, this list of conditions and the following disclaimer.
      **   * Redistributions in binary form must reproduce the above copyright
      **     notice, this list of conditions and the following disclaimer in
      **     the documentation and/or other materials provided with the
      **     distribution.
      **   * Neither the name of The Qt Company Ltd nor the names of its
      **     contributors may be used to endorse or promote products derived
      **     from this software without specific prior written permission.
      **
      **
      ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
      ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
      ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
      ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
      ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
      ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
      ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
      ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
      ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
      ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
      **
      ** $QT_END_LICENSE$
      **
      ****************************************************************************/

      /****************************************************************************
      **
      ** This is a simple QGLWidget displaying an openGL wireframe box
      **
      ** The OpenGL code is mostly borrowed from Brian Pauls "spin" example
      ** in the Mesa distribution
      **
      ****************************************************************************/

      #include "glbox.h"
      #include <QAxAggregated>
      #include <QUuid>
      #include <objsafe.h>

      #if defined(Q_CC_MSVC)
      #pragma warning(disable:4305) // init: truncation from const double to float
      #endif

      /*!
        Create a GLBox widget
      */

      GLBox::GLBox( QWidget* parent, const char* name )
          : QGLWidget( parent )
      {
          xRot = yRot = zRot = 0.0;           // default object rotation
          scale = 1.25;                       // default object scale
          object = 0;
      }

      /*!
        Release allocated resources
      */

      GLBox::~GLBox()
      {
          makeCurrent();
          glDeleteLists( object, 1 );
      }

      /*!
        Paint the box. The actual openGL commands for drawing the box are
        performed here.
      */

      void GLBox::paintGL()
      {
          glClear( GL_COLOR_BUFFER_BIT );

          glLoadIdentity();
          glTranslatef( 0.0, 0.0, -10.0 );
          glScalef( scale, scale, scale );

          glRotatef( xRot, 1.0, 0.0, 0.0 );
          glRotatef( yRot, 0.0, 1.0, 0.0 );
          glRotatef( zRot, 0.0, 0.0, 1.0 );

          glCallList( object );
      }

      /*!
        Set up the OpenGL rendering state, and define display list
      */

      void GLBox::initializeGL()
      {
          qglClearColor(Qt::black);           // Let OpenGL clear to black
          object = makeObject();              // Generate an OpenGL display list
          glShadeModel( GL_FLAT );
      }

      /*!
        Set up the OpenGL view port, matrix mode, etc.
      */

      void GLBox::resizeGL( int w, int h )
      {
          glViewport( 0, 0, (GLint)w, (GLint)h );
          glMatrixMode( GL_PROJECTION );
          glLoadIdentity();
          glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 );
          glMatrixMode( GL_MODELVIEW );
      }

      /*!
        Generate an OpenGL display list for the object to be shown, i.e. the box
      */

      GLuint GLBox::makeObject()
      {
          GLuint list;

          list = glGenLists( 1 );

          glNewList( list, GL_COMPILE );

          qglColor(Qt::white);                      // Shorthand for glColor3f or glIndex

          glLineWidth( 2.0 );

          glBegin( GL_LINE_LOOP );
          glVertex3f(  1.0,  0.5, -0.4 );
          glVertex3f(  1.0, -0.5, -0.4 );
          glVertex3f( -1.0, -0.5, -0.4 );
          glVertex3f( -1.0,  0.5, -0.4 );
          glEnd();

          glBegin( GL_LINE_LOOP );
          glVertex3f(  1.0,  0.5, 0.4 );
          glVertex3f(  1.0, -0.5, 0.4 );
          glVertex3f( -1.0, -0.5, 0.4 );
          glVertex3f( -1.0,  0.5, 0.4 );
          glEnd();

          glBegin( GL_LINES );
          glVertex3f(  1.0,  0.5, -0.4 );   glVertex3f(  1.0,  0.5, 0.4 );
          glVertex3f(  1.0, -0.5, -0.4 );   glVertex3f(  1.0, -0.5, 0.4 );
          glVertex3f( -1.0, -0.5, -0.4 );   glVertex3f( -1.0, -0.5, 0.4 );
          glVertex3f( -1.0,  0.5, -0.4 );   glVertex3f( -1.0,  0.5, 0.4 );
          glEnd();

          glEndList();

          return list;
      }

      /*!
        Set the rotation angle of the object to \e degrees around the X axis.
      */

      void GLBox::setXRotation( int degrees )
      {
          xRot = (GLfloat)(degrees % 360);
          updateGL();
      }

      /*!
        Set the rotation angle of the object to \e degrees around the Y axis.
      */

      void GLBox::setYRotation( int degrees )
      {
          yRot = (GLfloat)(degrees % 360);
          updateGL();
      }

      /*!
        Set the rotation angle of the object to \e degrees around the Z axis.
      */

      void GLBox::setZRotation( int degrees )
      {
          zRot = (GLfloat)(degrees % 360);
          updateGL();
      }

      class ObjectSafetyImpl : public QAxAggregated,
                               public IObjectSafety
      {
      public:
          ObjectSafetyImpl() {}

          long queryInterface( const QUuid &iid, void **iface )
          {
              *iface = 0;
              if ( iid == IID_IObjectSafety )
                  *iface = (IObjectSafety*)this;
              else
                  return E_NOINTERFACE;

              AddRef();
              return S_OK;
          }

          QAXAGG_IUNKNOWN;

          HRESULT WINAPI GetInterfaceSafetyOptions( REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions )
          {
              *pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACESAFE_FOR_UNTRUSTED_CALLER;
              *pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACESAFE_FOR_UNTRUSTED_CALLER;
              return S_OK;
          }
          HRESULT WINAPI SetInterfaceSafetyOptions( REFIID riid, DWORD pdwSupportedOptions, DWORD pdwEnabledOptions )
          {
              return S_OK;
          }
      };

      QAxAggregated *GLBox::createAggregate()
      {
          return new ObjectSafetyImpl();
      }