source: trunk/examples/activeqt/opengl/glbox.cpp@ 385

Last change on this file since 385 was 2, checked in by Dmitry A. Kuminov, 16 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 6.1 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** Contact: Qt Software Information ([email protected])
5**
6** This file is part of the examples of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial Usage
10** Licensees holding valid Qt Commercial licenses may use this file in
11** accordance with the Qt Commercial License Agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Nokia.
14**
15** GNU Lesser General Public License Usage
16** Alternatively, this file may be used under the terms of the GNU Lesser
17** General Public License version 2.1 as published by the Free Software
18** Foundation and appearing in the file LICENSE.LGPL included in the
19** packaging of this file. Please review the following information to
20** ensure the GNU Lesser General Public License version 2.1 requirements
21** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
22**
23** In addition, as a special exception, Nokia gives you certain
24** additional rights. These rights are described in the Nokia Qt LGPL
25** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
26** package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you are unsure which license is appropriate for your use, please
37** contact the sales department at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42/****************************************************************************
43**
44** This is a simple QGLWidget displaying an openGL wireframe box
45**
46** The OpenGL code is mostly borrowed from Brian Pauls "spin" example
47** in the Mesa distribution
48**
49****************************************************************************/
50
51#include "glbox.h"
52#include <QAxAggregated>
53#include <QUuid>
54//! [0]
55#include <objsafe.h>
56//! [0]
57
58#if defined(Q_CC_MSVC)
59#pragma warning(disable:4305) // init: truncation from const double to float
60#endif
61
62/*!
63 Create a GLBox widget
64*/
65
66GLBox::GLBox( QWidget* parent, const char* name )
67 : QGLWidget( parent )
68{
69 xRot = yRot = zRot = 0.0; // default object rotation
70 scale = 1.25; // default object scale
71 object = 0;
72}
73
74
75/*!
76 Release allocated resources
77*/
78
79GLBox::~GLBox()
80{
81 makeCurrent();
82 glDeleteLists( object, 1 );
83}
84
85
86/*!
87 Paint the box. The actual openGL commands for drawing the box are
88 performed here.
89*/
90
91void GLBox::paintGL()
92{
93 glClear( GL_COLOR_BUFFER_BIT );
94
95 glLoadIdentity();
96 glTranslatef( 0.0, 0.0, -10.0 );
97 glScalef( scale, scale, scale );
98
99 glRotatef( xRot, 1.0, 0.0, 0.0 );
100 glRotatef( yRot, 0.0, 1.0, 0.0 );
101 glRotatef( zRot, 0.0, 0.0, 1.0 );
102
103 glCallList( object );
104}
105
106
107/*!
108 Set up the OpenGL rendering state, and define display list
109*/
110
111void GLBox::initializeGL()
112{
113 qglClearColor(Qt::black); // Let OpenGL clear to black
114 object = makeObject(); // Generate an OpenGL display list
115 glShadeModel( GL_FLAT );
116}
117
118
119
120/*!
121 Set up the OpenGL view port, matrix mode, etc.
122*/
123
124void GLBox::resizeGL( int w, int h )
125{
126 glViewport( 0, 0, (GLint)w, (GLint)h );
127 glMatrixMode( GL_PROJECTION );
128 glLoadIdentity();
129 glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 );
130 glMatrixMode( GL_MODELVIEW );
131}
132
133
134/*!
135 Generate an OpenGL display list for the object to be shown, i.e. the box
136*/
137
138GLuint GLBox::makeObject()
139{
140 GLuint list;
141
142 list = glGenLists( 1 );
143
144 glNewList( list, GL_COMPILE );
145
146 qglColor(Qt::white); // Shorthand for glColor3f or glIndex
147
148 glLineWidth( 2.0 );
149
150 glBegin( GL_LINE_LOOP );
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 glVertex3f( -1.0, 0.5, -0.4 );
155 glEnd();
156
157 glBegin( GL_LINE_LOOP );
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 glVertex3f( -1.0, 0.5, 0.4 );
162 glEnd();
163
164 glBegin( GL_LINES );
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 glVertex3f( -1.0, 0.5, -0.4 ); glVertex3f( -1.0, 0.5, 0.4 );
169 glEnd();
170
171 glEndList();
172
173 return list;
174}
175
176
177/*!
178 Set the rotation angle of the object to \e degrees around the X axis.
179*/
180
181void GLBox::setXRotation( int degrees )
182{
183 xRot = (GLfloat)(degrees % 360);
184 updateGL();
185}
186
187
188/*!
189 Set the rotation angle of the object to \e degrees around the Y axis.
190*/
191
192void GLBox::setYRotation( int degrees )
193{
194 yRot = (GLfloat)(degrees % 360);
195 updateGL();
196}
197
198
199/*!
200 Set the rotation angle of the object to \e degrees around the Z axis.
201*/
202
203void GLBox::setZRotation( int degrees )
204{
205 zRot = (GLfloat)(degrees % 360);
206 updateGL();
207}
208
209//! [1]
210class ObjectSafetyImpl : public QAxAggregated,
211 public IObjectSafety
212{
213public:
214//! [1] //! [2]
215 ObjectSafetyImpl() {}
216
217 long queryInterface( const QUuid &iid, void **iface )
218 {
219 *iface = 0;
220 if ( iid == IID_IObjectSafety )
221 *iface = (IObjectSafety*)this;
222 else
223 return E_NOINTERFACE;
224
225 AddRef();
226 return S_OK;
227 }
228
229//! [2] //! [3]
230 QAXAGG_IUNKNOWN;
231
232//! [3] //! [4]
233 HRESULT WINAPI GetInterfaceSafetyOptions( REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions )
234 {
235 *pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACESAFE_FOR_UNTRUSTED_CALLER;
236 *pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACESAFE_FOR_UNTRUSTED_CALLER;
237 return S_OK;
238 }
239 HRESULT WINAPI SetInterfaceSafetyOptions( REFIID riid, DWORD pdwSupportedOptions, DWORD pdwEnabledOptions )
240 {
241 return S_OK;
242 }
243};
244//! [4] //! [5]
245
246QAxAggregated *GLBox::createAggregate()
247{
248 return new ObjectSafetyImpl();
249}
250//! [5]
Note: See TracBrowser for help on using the repository browser.