QtGLGraphicsScene.cc 9.6 KB
Newer Older
1
/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
2
3
*                                                                            *
*                              OpenFlipper                                   *
Martin Schultz's avatar
Martin Schultz committed
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 *           Copyright (c) 2001-2015, RWTH-Aachen University                 *
 *           Department of Computer Graphics and Multimedia                  *
 *                          All rights reserved.                             *
 *                            www.openflipper.org                            *
 *                                                                           *
 *---------------------------------------------------------------------------*
 * This file is part of OpenFlipper.                                         *
 *---------------------------------------------------------------------------*
 *                                                                           *
 * Redistribution and use in source and binary forms, with or without        *
 * modification, are permitted provided that the following conditions        *
 * are met:                                                                  *
 *                                                                           *
 * 1. Redistributions of source code must retain the above copyright notice, *
 *    this list of conditions and the following disclaimer.                  *
 *                                                                           *
 * 2. 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.   *
 *                                                                           *
 * 3. Neither the name of the copyright holder 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 HOLDER *
 * 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.              *
Jan Möbius's avatar
Jan Möbius committed
39
*                                                                            *
40
41
42
\*===========================================================================*/

/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
43
44
45
46
47
*                                                                            *
*   $Revision$                                                       *
*   $LastChangedBy$                                                *
*   $Date$                     *
*                                                                            *
48
\*===========================================================================*/
Jan Möbius's avatar
   
Jan Möbius committed
49
50
51
52
53
54
55
56
57
58
59
60




//=============================================================================
//
//  CLASS QtGLGraphicsScene - IMPLEMENTATION
//
//=============================================================================

//== INCLUDES =================================================================

61
#include <ACG/GL/acg_glew.hh>
62
#include <OpenFlipper/BasePlugin/PluginFunctions.hh>
Jan Möbius's avatar
   
Jan Möbius committed
63
#include "QtGLGraphicsScene.hh"
64
#include "QtMultiViewLayout.hh"
65
#include <QApplication>
Jan Möbius's avatar
   
Jan Möbius committed
66
67
68
69
70
71
72
73
#include <QPainter>
#include <QPaintEngine>
#include <QGraphicsSceneMouseEvent>

//== NAMESPACES ===============================================================

//== IMPLEMENTATION ===========================================================

74
75
QtGLGraphicsScene::QtGLGraphicsScene(std::vector< glViewer *> *_views,
				     QtMultiViewLayout *_layout) :
Jan Möbius's avatar
   
Jan Möbius committed
76
  QGraphicsScene (),
77
  views_(_views),
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
78
79
  layout_(_layout),
  cursorPainter_(0)
Jan Möbius's avatar
   
Jan Möbius committed
80
81
82
{
}

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
83
//-----------------------------------------------------------------------------
Jan Möbius's avatar
Jan Möbius committed
84

85
void QtGLGraphicsScene::drawBackground(QPainter *_painter, const QRectF &_rect)
Jan Möbius's avatar
   
Jan Möbius committed
86
{
Jan Möbius's avatar
Jan Möbius committed
87
88
89
90
91
92
93
94
95
96
97
98
99
  // Check for switch in qt4.6 to OpenGL2
  #if QT_VERSION >= 0x040600
    if (_painter->paintEngine()->type() != QPaintEngine::OpenGL && _painter->paintEngine()->type() != QPaintEngine::OpenGL2 ) {
      std::cerr << "QtGLGraphicsScene: drawBackground needs a QGLWidget to be set as viewport on the graphics view\n";
      return;
    }
  #else
    if (_painter->paintEngine()->type() != QPaintEngine::OpenGL ) {
      std::cerr << "QtGLGraphicsScene: drawBackground needs a QGLWidget to be set as viewport on the graphics view\n";
      return;
    }
  #endif

100
101
102
103
104
  // Initialize background first
  _painter->setBackground(QApplication::palette().window());
  _painter->eraseRect(_rect);

  // From now on we do OpenGL direct painting on the scene
Jan Möbius's avatar
Jan Möbius committed
105
  #if QT_VERSION >= 0x040600
106
107
    // Tell Qt that we directly use OpenGL
    _painter->beginNativePainting();
Jan Möbius's avatar
Jan Möbius committed
108
  #endif
Jan Möbius's avatar
   
Jan Möbius committed
109

Jan Möbius's avatar
Jan Möbius committed
110
111
112
  static bool initialized = false;
  if (!initialized)
  {
113
#ifndef __APPLE__
Jan's avatar
Jan committed
114
    // we use GLEW to manage extensions
Jan Möbius's avatar
Jan Möbius committed
115
    // initialize it first
Jan's avatar
Jan committed
116
    glewInit();
117
#endif
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
118
119
120
121
    for (unsigned int i = 0; i < views_->size (); i++)
    {
      views_->at(i)->initializeGL ();
    }
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
122
123
    if (cursorPainter_)
      cursorPainter_->initializeGL ();
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
124
    initialized = true;
Jan Möbius's avatar
Jan Möbius committed
125
  }
Jan Möbius's avatar
   
Jan Möbius committed
126

127
  // Update the cursor position in all viewers
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
  if (cursorPainter_ && cursorPainter_->enabled())
  {
    // avoid projection matrix stack overflow
    GLdouble mat[16];
    glGetDoublev(GL_PROJECTION_MATRIX, mat);

    glMatrixMode(GL_MODELVIEW);
    glPushMatrix ();

    glPushAttrib (GL_ALL_ATTRIB_BITS);
    for (unsigned int i = 0; i < views_->size (); i++)
    {
      if (views_->at(i)->isVisible())
        views_->at(i)->updateCursorPosition(cursorPainter_->cursorPosition ());
    }
    glPopAttrib ();

    glMatrixMode(GL_PROJECTION);
    glLoadMatrixd (mat);
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix ();
  }

151
152
  // Clear the depth buffer (This is required since QT4.6 Otherwise we get an emtpty scene!
  glClear(GL_DEPTH_BUFFER_BIT);
153

154
  // Paint the viewers
Jan Möbius's avatar
Jan Möbius committed
155
156
157
158
159
  for (unsigned int i = 0; i < views_->size (); i++)
  {
    if (views_->at(i)->isVisible())
      views_->at(i)->paintGL();
  }
160

Jan Möbius's avatar
Jan Möbius committed
161
  #if QT_VERSION >= 0x040600
162
163
    // The rest is painting through QT again. 
    _painter->endNativePainting();
Jan Möbius's avatar
Jan Möbius committed
164
  #endif
165

166
  // Draw red box around active examiner
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
  if (layout_->mode() != QtMultiViewLayout::SingleView)
  {
    glViewer *v = views_->at(PluginFunctions::activeExaminer());

    QPen pen(Qt::red);
    pen.setWidth (2);
    _painter->setPen(pen);
    _painter->drawLine(v->scenePos().x(), v->scenePos().y(),
                       v->scenePos().x(),
                       v->scenePos().y() + v->size().height() - 1);
    _painter->drawLine(v->scenePos().x() + v->size().width(), v->scenePos().y(),
                       v->scenePos().x() + v->size().width(),
                       v->scenePos().y() + v->size().height() - 1);
    _painter->drawLine(v->scenePos().x(), v->scenePos().y() - 1,
                       v->scenePos().x() + v->size().width(),
                       v->scenePos().y() - 1);
    _painter->drawLine(v->scenePos().x(),
                       v->scenePos().y() + v->size().height() - 1,
                       v->scenePos().x() + v->size().width(),
                       v->scenePos().y() + v->size().height() - 1);
  }
Jan Möbius's avatar
   
Jan Möbius committed
188
189
}

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
190
//-----------------------------------------------------------------------------
191

192
glViewer* QtGLGraphicsScene::findView (const QPointF &_p, bool _setActive)
Jan Möbius's avatar
   
Jan Möbius committed
193
194
195
{
  for (unsigned int i = 0; i < views_->size (); i++)
  {
196
197
198
199
    if (views_->at(i)->contains(views_->at(i)->mapFromScene (_p)))
    {
      if (_setActive && PluginFunctions::activeExaminer() != i)
      {
Jan Möbius's avatar
Jan Möbius committed
200
201
        PluginFunctions::setActiveExaminer(i);
        update();
202
203
204
      }
      return views_->at(i);
    }
Jan Möbius's avatar
   
Jan Möbius committed
205
206
207
  }
  return NULL;
}
Jan Möbius's avatar
   
Jan Möbius committed
208

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
209
210
//-----------------------------------------------------------------------------

Jan Möbius's avatar
   
Jan Möbius committed
211
212
213
214
215
216
void QtGLGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent* _e)
{
  QGraphicsScene::mouseMoveEvent(_e);
  if (_e->isAccepted())
    return;

217
  glViewer *v = findView (_e->scenePos());
Jan Möbius's avatar
   
Jan Möbius committed
218
  if (!v)
Jan Möbius's avatar
   
Jan Möbius committed
219
220
    return;

221
  v->mouseMoveEvent(_e);
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
}

//-----------------------------------------------------------------------------

void QtGLGraphicsScene::setCursorPainter(CursorPainter * _cursorPainter)
{
  cursorPainter_ = _cursorPainter;
}

//-----------------------------------------------------------------------------

bool QtGLGraphicsScene::event(QEvent *_event)
{
  if (cursorPainter_ && _event->type() == QEvent::Enter)
  {
    cursorPainter_->setMouseIn (true);
  }
  else if (cursorPainter_ && _event->type() == QEvent::Leave)
  {
    cursorPainter_->setMouseIn (false);
    update ();
  }
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
244
245
246
247
248
249
250
  else if (cursorPainter_ && _event->type() == QEvent::GraphicsSceneMouseMove)
  {
    QGraphicsSceneMouseEvent *e = static_cast<QGraphicsSceneMouseEvent*>(_event);
    cursorPainter_->updateCursorPosition (e->scenePos ());
    update ();
  }

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
251
  return QGraphicsScene::event (_event);
Jan Möbius's avatar
   
Jan Möbius committed
252
253
254
255
256
}


//=============================================================================
//=============================================================================
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
257