simpleGLGraphicsScene.cc 7.04 KB
Newer Older
1 2 3 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
/*===========================================================================*\
 *                                                                           *
 *                              OpenFlipper                                  *
 *      Copyright (C) 2001-2009 by Computer Graphics Group, RWTH Aachen      *
 *                           www.openflipper.org                             *
 *                                                                           *
 *---------------------------------------------------------------------------*
 *  This file is part of OpenFlipper.                                        *
 *                                                                           *
 *  OpenFlipper is free software: you can redistribute it and/or modify      *
 *  it under the terms of the GNU Lesser General Public License as           *
 *  published by the Free Software Foundation, either version 3 of           *
 *  the License, or (at your option) any later version with the              *
 *  following exceptions:                                                    *
 *                                                                           *
 *  If other files instantiate templates or use macros                       *
 *  or inline functions from this file, or you compile this file and         *
 *  link it with other files to produce an executable, this file does        *
 *  not by itself cause the resulting executable to be covered by the        *
 *  GNU Lesser General Public License. This exception does not however       *
 *  invalidate any other reasons why the executable file might be            *
 *  covered by the GNU Lesser General Public License.                        *
 *                                                                           *
 *  OpenFlipper is distributed in the hope that it will be useful,           *
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of           *
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            *
 *  GNU Lesser General Public License for more details.                      *
 *                                                                           *
 *  You should have received a copy of the GNU LesserGeneral Public          *
 *  License along with OpenFlipper. If not,                                  *
 *  see <http://www.gnu.org/licenses/>.                                      *
 *                                                                           *
\*===========================================================================*/

/*===========================================================================*\
 *                                                                           *
37 38 39
 *   $Revision$                                                         *
 *   $Author$                                                      *
 *   $Date$                   *
40 41
 *                                                                           *
\*===========================================================================*/
42 43 44 45 46 47 48 49 50 51 52 53




//=============================================================================
//
//  CLASS SimpleGLGraphicsScene - IMPLEMENTATION
//
//=============================================================================

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

Jan Möbius's avatar
Dennis:  
Jan Möbius committed
54
#include <OpenFlipper/common/GlobalOptions.hh>
55 56 57 58 59 60 61 62 63
#include <OpenFlipper/BasePlugin/PluginFunctions.hh>
#include <OpenFlipper/widgets/glWidget/QtBaseViewer.hh>
#include <QApplication>
#include <QPainter>
#include <QPaintEngine>
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsSceneDragDropEvent>

#include "simpleGLGraphicsScene.hh"
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
64
#include "CursorPainter.hh"
65 66 67 68 69 70 71 72 73 74

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

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

SimpleGLGraphicsScene::SimpleGLGraphicsScene () :
  QGraphicsScene (),
  view_(),
  initialized_(false)
{
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
75
  cursorPainter_ = new CursorPainter (this);
76
  cursorPainter_->setEnabled( OpenFlipperSettings().value("Core/Gui/glViewer/nativeMouse",false).toBool() );
77 78 79 80 81
}


void SimpleGLGraphicsScene::drawBackground(QPainter *_painter, const QRectF &_rect)
{
82 83 84 85 86 87 88 89 90 91
  
  // 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";
92 93
    return;
  }
94 95 96 97 98
  #endif
  
  // Initialize background first
  _painter->setBackground(QApplication::palette().window());
  _painter->eraseRect(_rect);
99 100 101

  if (!view_)
    return;
102 103 104 105 106 107
  
  // From now on we do OpenGL direct painting on the scene
  #if QT_VERSION >= 0x040600
  // Tell Qt that we directly use OpenGL
  _painter->beginNativePainting();
  #endif
108 109 110 111 112 113 114

  if (!initialized_)
  {
    // we use GLEW to manage extensions
    // initialize it first
    glewInit();
    view_->initializeGL();
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
115
    cursorPainter_->initializeGL ();
116 117 118
    initialized_ = true;
  }

Jan Möbius's avatar
Dennis:  
Jan Möbius committed
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
  if (cursorPainter_->enabled())
  {
    // avoid projection matrix stack overflow
    GLdouble mat[16];
    glGetDoublev(GL_PROJECTION_MATRIX, mat);

    glMatrixMode(GL_MODELVIEW);
    glPushMatrix ();

    glPushAttrib (GL_ALL_ATTRIB_BITS);
    view_->updateCursorPosition(cursorPainter_->cursorPosition ());
    glPopAttrib ();

    glMatrixMode(GL_PROJECTION);
    glLoadMatrixd (mat);
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix ();
    glClear(GL_DEPTH_BUFFER_BIT);
  }
  
139 140
  // Clear the depth buffer (This is required since QT4.6 Otherwise we get an emtpty scene!
  glClear(GL_DEPTH_BUFFER_BIT);
141 142

  view_->paintGL();
143 144 145 146 147
  
  #if QT_VERSION >= 0x040600
  // The rest is painting through QT again. 
  _painter->endNativePainting();
  #endif
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
}


void SimpleGLGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent* _e)
{
  QGraphicsScene::mouseMoveEvent(_e);
  if (_e->isAccepted())
    return;

  if (view_)
    view_->mouseMoveEvent(_e);
}

void SimpleGLGraphicsScene::setView(glViewer * _view)
{
  view_ = _view;
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
  cursorPainter_->registerViewer (view_);
}

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

bool SimpleGLGraphicsScene::event(QEvent *_event)
{
  if (_event->type() == QEvent::Enter)
  {
    cursorPainter_->setMouseIn (true);
  }
  else if (_event->type() == QEvent::Leave)
  {
    cursorPainter_->setMouseIn (false);
    update ();
  }
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
180 181 182 183 184 185
  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
186
  return QGraphicsScene::event (_event);
187 188 189 190 191 192
}

//=============================================================================
//=============================================================================