1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the examples of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:BSD$
9 ** You may use this file under the terms of the BSD license as follows:
10 **
11 ** "Redistribution and use in source and binary forms, with or without
12 ** modification, are permitted provided that the following conditions are
13 ** met:
14 **   * Redistributions of source code must retain the above copyright
15 **     notice, this list of conditions and the following disclaimer.
16 **   * Redistributions in binary form must reproduce the above copyright
17 **     notice, this list of conditions and the following disclaimer in
18 **     the documentation and/or other materials provided with the
19 **     distribution.
20 **   * Neither the name of The Qt Company Ltd nor the names of its
21 **     contributors may be used to endorse or promote products derived
22 **     from this software without specific prior written permission.
23 **
24 **
25 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
36 **
37 ** $QT_END_LICENSE$
38 **
39 ****************************************************************************/
40 
41 /****************************************************************************
42 **
43 ** This is a simple QGLWidget displaying an openGL wireframe box
44 **
45 ** The OpenGL code is mostly borrowed from Brian Pauls "spin" example
46 ** in the Mesa distribution
47 **
48 ****************************************************************************/
49 
50 #include "glbox.h"
51 #include <QAxAggregated>
52 #include <QUuid>
53 //! [0]
54 #include <objsafe.h>
55 //! [0]
56 
57 #if defined(Q_CC_MSVC)
58 #pragma warning(disable:4305) // init: truncation from const double to float
59 #endif
60 
61 /*!
62   Create a GLBox widget
63 */
64 
GLBox(QWidget * parent,const char * name)65 GLBox::GLBox( QWidget* parent, const char* name )
66     : QGLWidget( parent )
67 {
68     xRot = yRot = zRot = 0.0;		// default object rotation
69     scale = 1.25;			// default object scale
70     object = 0;
71 }
72 
73 
74 /*!
75   Release allocated resources
76 */
77 
~GLBox()78 GLBox::~GLBox()
79 {
80     makeCurrent();
81     glDeleteLists( object, 1 );
82 }
83 
84 
85 /*!
86   Paint the box. The actual openGL commands for drawing the box are
87   performed here.
88 */
89 
paintGL()90 void GLBox::paintGL()
91 {
92     glClear( GL_COLOR_BUFFER_BIT );
93 
94     glLoadIdentity();
95     glTranslatef( 0.0, 0.0, -10.0 );
96     glScalef( scale, scale, scale );
97 
98     glRotatef( xRot, 1.0, 0.0, 0.0 );
99     glRotatef( yRot, 0.0, 1.0, 0.0 );
100     glRotatef( zRot, 0.0, 0.0, 1.0 );
101 
102     glCallList( object );
103 }
104 
105 
106 /*!
107   Set up the OpenGL rendering state, and define display list
108 */
109 
initializeGL()110 void GLBox::initializeGL()
111 {
112     qglClearColor(Qt::black); 		// Let OpenGL clear to black
113     object = makeObject();		// Generate an OpenGL display list
114     glShadeModel( GL_FLAT );
115 }
116 
117 
118 
119 /*!
120   Set up the OpenGL view port, matrix mode, etc.
121 */
122 
resizeGL(int w,int h)123 void GLBox::resizeGL( int w, int h )
124 {
125     glViewport( 0, 0, (GLint)w, (GLint)h );
126     glMatrixMode( GL_PROJECTION );
127     glLoadIdentity();
128     glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 );
129     glMatrixMode( GL_MODELVIEW );
130 }
131 
132 
133 /*!
134   Generate an OpenGL display list for the object to be shown, i.e. the box
135 */
136 
makeObject()137 GLuint GLBox::makeObject()
138 {
139     GLuint list;
140 
141     list = glGenLists( 1 );
142 
143     glNewList( list, GL_COMPILE );
144 
145     qglColor(Qt::white);		      // Shorthand for glColor3f or glIndex
146 
147     glLineWidth( 2.0 );
148 
149     glBegin( GL_LINE_LOOP );
150     glVertex3f(  1.0,  0.5, -0.4 );
151     glVertex3f(  1.0, -0.5, -0.4 );
152     glVertex3f( -1.0, -0.5, -0.4 );
153     glVertex3f( -1.0,  0.5, -0.4 );
154     glEnd();
155 
156     glBegin( GL_LINE_LOOP );
157     glVertex3f(  1.0,  0.5, 0.4 );
158     glVertex3f(  1.0, -0.5, 0.4 );
159     glVertex3f( -1.0, -0.5, 0.4 );
160     glVertex3f( -1.0,  0.5, 0.4 );
161     glEnd();
162 
163     glBegin( GL_LINES );
164     glVertex3f(  1.0,  0.5, -0.4 );   glVertex3f(  1.0,  0.5, 0.4 );
165     glVertex3f(  1.0, -0.5, -0.4 );   glVertex3f(  1.0, -0.5, 0.4 );
166     glVertex3f( -1.0, -0.5, -0.4 );   glVertex3f( -1.0, -0.5, 0.4 );
167     glVertex3f( -1.0,  0.5, -0.4 );   glVertex3f( -1.0,  0.5, 0.4 );
168     glEnd();
169 
170     glEndList();
171 
172     return list;
173 }
174 
175 
176 /*!
177   Set the rotation angle of the object to \e degrees around the X axis.
178 */
179 
setXRotation(int degrees)180 void GLBox::setXRotation( int degrees )
181 {
182     xRot = (GLfloat)(degrees % 360);
183     updateGL();
184 }
185 
186 
187 /*!
188   Set the rotation angle of the object to \e degrees around the Y axis.
189 */
190 
setYRotation(int degrees)191 void GLBox::setYRotation( int degrees )
192 {
193     yRot = (GLfloat)(degrees % 360);
194     updateGL();
195 }
196 
197 
198 /*!
199   Set the rotation angle of the object to \e degrees around the Z axis.
200 */
201 
setZRotation(int degrees)202 void GLBox::setZRotation( int degrees )
203 {
204     zRot = (GLfloat)(degrees % 360);
205     updateGL();
206 }
207 
208 //! [1]
209 class ObjectSafetyImpl : public QAxAggregated,
210 			 public IObjectSafety
211 {
212 public:
213 //! [1] //! [2]
ObjectSafetyImpl()214     ObjectSafetyImpl() {}
215 
queryInterface(const QUuid & iid,void ** iface)216     long queryInterface( const QUuid &iid, void **iface )
217     {
218 	*iface = 0;
219 	if ( iid == IID_IObjectSafety )
220 	    *iface = (IObjectSafety*)this;
221 	else
222 	    return E_NOINTERFACE;
223 
224 	AddRef();
225 	return S_OK;
226     }
227 
228 //! [2] //! [3]
229     QAXAGG_IUNKNOWN;
230 
231 //! [3] //! [4]
GetInterfaceSafetyOptions(REFIID riid,DWORD * pdwSupportedOptions,DWORD * pdwEnabledOptions)232     HRESULT WINAPI GetInterfaceSafetyOptions( REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions )
233     {
234 	*pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACESAFE_FOR_UNTRUSTED_CALLER;
235 	*pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACESAFE_FOR_UNTRUSTED_CALLER;
236 	return S_OK;
237     }
SetInterfaceSafetyOptions(REFIID riid,DWORD pdwSupportedOptions,DWORD pdwEnabledOptions)238     HRESULT WINAPI SetInterfaceSafetyOptions( REFIID riid, DWORD pdwSupportedOptions, DWORD pdwEnabledOptions )
239     {
240 	return S_OK;
241     }
242 };
243 //! [4] //! [5]
244 
createAggregate()245 QAxAggregated *GLBox::createAggregate()
246 {
247     return new ObjectSafetyImpl();
248 }
249 //! [5]
250