ViewerProperties.hh 18.3 KB
Newer Older
1
/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
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
*                                                                            *
*                              OpenFlipper                                   *
*      Copyright (C) 2001-2010 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/>.                                       *
*                                                                            *
33 34 35
\*===========================================================================*/

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




//=============================================================================
//
//  Property storage Class for glWidgets
//
//=============================================================================

/**
 * \file ViewerProperties.hh
 * This file contains a class for managing all viewer settings
 */

//
#ifndef VIEWERPROPERTIES_HH
#define VIEWERPROPERTIES_HH

Jan Möbius's avatar
Jan Möbius committed
61

Jan Möbius's avatar
 
Jan Möbius committed
62
#include <QObject>
Dirk Wilden's avatar
Dirk Wilden committed
63
#include <QColor>
Jan Möbius's avatar
Jan Möbius committed
64
#include <OpenFlipper/common/GlobalDefines.hh>
65
#include <ACG/Math/VectorT.hh>
66
#include <ACG/Scenegraph/SceneGraph.hh>
Jan Möbius's avatar
Jan Möbius committed
67
#include <ACG/Scenegraph/DrawModes.hh>
68
#include <ACG/GL/GLState.hh>
Jan Möbius's avatar
 
Jan Möbius committed
69

Jan Möbius's avatar
Jan Möbius committed
70 71 72
// forward declaration
class ViewObjectMarker;

Jan Möbius's avatar
 
Jan Möbius committed
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
namespace Viewer {

  /// How to react on mouse events?
  enum ActionMode {
    // examine geometry, get transformations from mouse events
    ExamineMode,
    /** Picking mode. Actually no pick()ing is performed (!) but events are
        forwarded to the application via signalMouseEvent().
      */
    PickingMode,
    // same as picking, but emit signalMouseEventIdentify()
    QuestionMode,
    // Ligh rotation mode
    LightMode
  };

Jan Möbius's avatar
Jan Möbius committed
89
  class DLLEXPORT ViewerProperties : public QObject {
Jan Möbius's avatar
 
Jan Möbius committed
90 91 92 93 94 95

    Q_OBJECT

    public:
      ViewerProperties();
      ~ViewerProperties();
96 97 98 99 100
      
    //===========================================================================
    /** @name Draw Mode States
     * @{ */
    //===========================================================================      
Jan Möbius's avatar
 
Jan Möbius committed
101

102 103
    public:
      /// set draw mode (No test if this mode is available!)
Jan Möbius's avatar
Jan Möbius committed
104
      void drawMode(ACG::SceneGraph::DrawModes::DrawMode _mode) { currentDrawMode_ = _mode; emit updated(); };
105 106
      
      /// get current draw mode
Jan Möbius's avatar
Jan Möbius committed
107
      ACG::SceneGraph::DrawModes::DrawMode drawMode() { return currentDrawMode_; };
108 109 110
      
    private:
      
Jan Möbius's avatar
Jan Möbius committed
111
      ACG::SceneGraph::DrawModes::DrawMode currentDrawMode_;
Jan Möbius's avatar
 
Jan Möbius committed
112

113 114
    /** @} */
      
Jan Möbius's avatar
 
Jan Möbius committed
115
    //===========================================================================
116
    /** @name Snapshot settings
Jan Möbius's avatar
 
Jan Möbius committed
117 118 119
    * @{ */
    //===========================================================================

120 121 122 123 124 125 126 127 128 129
    public slots:
      /** Set the base file name and reset the counter for snapshots.

        The current snapshot counter will be added in front of the last "."
        in the filename.

        \a Note: Calling snapshotBaseFileName() will always reset the snapshot
        counter to 0.
      */
      void snapshotBaseFileName(const QString& _fname);
130 131 132 133

      /** Set the file type for snapshots. defaults to png"
      */
      void snapshotFileType(const QString& _type);
134

Ellen Dekkers's avatar
Ellen Dekkers committed
135 136 137
      /** Get the file type for the current snapshot */
      QString snapshotFileType() { return snapshotFileType_; };
      
138 139 140 141 142
      /** Get the name for the current snapshot */
      QString snapshotName() { return snapshotName_; };

      /** Get the counter for the current snapshot and increases the counter */
      int snapshotCounter() { return snapshotCounter_++; };
Jan Möbius's avatar
 
Jan Möbius committed
143

144 145
    private:
      QString                      snapshotName_;
146
      QString                      snapshotFileType_;
147
      int                          snapshotCounter_;
Jan Möbius's avatar
 
Jan Möbius committed
148 149 150

    /** @} */

151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
    //===========================================================================
    //===========================================================================
    /** @name Mouse Wheel Settings
    * @{ */
    //===========================================================================
    //===========================================================================


    public slots:
      /// Zoom factor when using mousewheel
      double wheelZoomFactor() { return wZoomFactor_; };

      /// Zoom factor when using mousewheel and pressing shift
      double wheelZoomFactorShift() { return wZoomFactorShift_; };

      /// Set zoom factor when using mousewheel
      void wheelZoomFactor(double _factor) { wZoomFactor_ = _factor; };

      /// Set zoom factor when using mousewheel and pressing shift
Jan Möbius's avatar
Jan Möbius committed
170
      void wheelZoomFactorShift(double _factor) { wZoomFactorShift_ = _factor; }; 
171 172 173 174 175 176 177 178

    private:
      double wZoomFactor_;

      double wZoomFactorShift_;

    /** @} */

179 180 181 182 183 184 185 186 187
    //===========================================================================
    //===========================================================================
    /** @name View Control
    * @{ */
    //===========================================================================
    //===========================================================================

    /** @} */

188
    //===========================================================================
189 190 191 192
    //===========================================================================
    /** @name Rendering Settings
    * @{ */
    //===========================================================================
193 194
    //===========================================================================

195 196 197 198 199 200 201 202 203 204 205 206 207
    public slots:
      /** true if counter clockwise orientation should be used to define front facing orientation.
       */
      bool isCCWFront(){ return CCWFront_; };

      /// Set counter clockwise orientation as front
      void ccwFront() { CCWFront_ = true; emit updated(); };
      /// Set clockwise orientation as front
      void cwFront() { CCWFront_ = false; emit updated(); };

    private:
      bool CCWFront_;

208 209 210

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

211 212 213 214 215
    public slots:

      /// Get current background color
      ACG::Vec4f backgroundColor() { return backgroundColor_; }

Dirk Wilden's avatar
Dirk Wilden committed
216 217 218 219 220 221 222 223
      /// Get current background color
      QRgb backgroundColorRgb(){ QColor c;
                                 c.setRedF(  backgroundColor_[0]);
                                 c.setGreenF(backgroundColor_[1]);
                                 c.setBlueF( backgroundColor_[2]);
                                 c.setAlphaF(backgroundColor_[3]);
                                 return c.rgba(); };

224 225 226 227
      /** Set background color.
      */
      void backgroundColor( ACG::Vec4f _color ) { backgroundColor_ = _color; emit updated(); };

Dirk Wilden's avatar
Dirk Wilden committed
228 229 230 231 232 233 234 235 236
      /** Set background color.
      */
      void backgroundColor( QRgb _color ) { QColor c(_color);
                                            backgroundColor_[0] = c.redF();
                                            backgroundColor_[1] = c.greenF();
                                            backgroundColor_[2] = c.blueF();
                                            backgroundColor_[3] = c.alphaF();
                                            emit updated(); };

237 238 239
    private:
      ACG::Vec4f backgroundColor_;

240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258
    //===========================================================================

    public slots:

      /// Render picking or not
      bool renderPicking() { return renderPicking_; };

      /// Mode used for the picking renderer
      ACG::SceneGraph::PickTarget renderPickingMode() { return pickRendererMode_; };

      void renderPickin(bool _mode ) { renderPicking_ = _mode; emit updated(); };

      /** Use this function to switch the viewer to visualize picking.
      * When you set this function to true the renderer will render the picking
      * elements rather then the scene
      */
      void renderPicking(bool _renderPicking, ACG::SceneGraph::PickTarget _mode) {
        pickRendererMode_ = _mode ; renderPicking_ = _renderPicking; emit updated();
      }
259 260 261 262 263 264 265 266 267
      
      /** Render depth image or color image
      */
      bool renderDepthImage(){ return renderDepthImage_; };
     
      /** Render depth image or color image
      */
      void renderDepthImage(bool _depth){ renderDepthImage_ = _depth; emit updated(); };
      
268 269 270 271
    private:
      /** This variable controls if the scene is rendered in normal or in picking mode
      */
      bool renderPicking_;
272 273 274 275
      
      /** This variable controls if the depth image is rendered instead of the color image
      */
      bool renderDepthImage_;
276 277 278 279 280 281 282

      /** If rendering is in picking mode, this variable controls which picking targets
      * will be rendered. ( see renderPicking_ , renderPicking(bool _renderPicking, PickRendererMode _mode) ,
      * and ACG::SceneGraph::PickTarget
      */
      ACG::SceneGraph::PickTarget pickRendererMode_;

283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309

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

    public slots:
      /** Lock update of display.
      If locked (isUpdateLocked()) then all calls to updateDisplayList()
      and updateGL() will have no effect! This is true until the display is
      unlockUpdate()'ed.
      */
      void lockUpdate()  { locked_++; };

      /// Unlock display locked by updateLock().
      void unLockUpdate(){
        locked_-- ;
        if ( locked_ <0 ) {
          std::cerr << "More unlocks then locks" << std::endl;
          locked_ = 0;
        }
      };

      /** Are updateDisplayList() and updateGL() locked?
      (c.f. lockUpdate()) */
      bool updateLocked() { return (locked_ != 0); };

    private:
      int locked_;

310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326

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

    public slots:
      /// Get current state of backface culling
      bool backFaceCulling() { return backFaceCulling_; };

      /// Enable or disable backface culling
      void backFaceCulling(bool _state ) { backFaceCulling_ = _state; emit updated(); }

    private:
      bool backFaceCulling_;

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

    public slots:
      /// set 2-sided lighting on/off
Dirk Wilden's avatar
Dirk Wilden committed
327
      void twoSidedLighting(bool _state ) { twoSidedLighting_ = _state; emit updated(); }
328 329 330 331 332 333

      /// is 2-sided lighing enabled?
      bool twoSidedLighting() { return twoSidedLighting_; };

    private:
      bool twoSidedLighting_;
334 335 336 337 338 339 340 341 342 343 344
      
    //===========================================================================

    public slots:
      /// set multisampling on/off
      void multisampling(bool _state ) { multisampling_ = _state; emit updated(); }

      /// is multisampling enabled?
      bool multisampling() { return multisampling_; };

    private:
345 346 347 348 349 350 351 352 353 354 355 356 357
      bool multisampling_;
      
    //===========================================================================

    public slots:
      /// set mipmapping on/off
      void mipmapping(bool _state ) { glState_->allow_mipmapping(_state); mipmapping_ = _state; emit updated(); }

      /// is mipmapping enabled?
      bool mipmapping() { return mipmapping_; };

    private:
      bool mipmapping_;
358 359 360 361 362 363 364 365 366 367 368 369 370

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

    public slots:
      /// set 2-sided lighting on/off
      void animation(bool _state ) { animation_ = _state; emit updated(); }

      /// is 2-sided lighing enabled?
      bool animation() { return animation_; };

    private:
      bool animation_;

371

372 373 374 375 376 377 378 379 380 381 382 383
    //===========================================================================

    public:
      /// Get the glState of the Viewer
      ACG::GLState& glState() { return (*glState_); };

      void setglState(ACG::GLState* _glState) { glState_ = _glState; };

    private:
      /// Pointer to the glState of the Viewer
      ACG::GLState* glState_;

Jan Möbius's avatar
Jan Möbius committed
384 385 386 387 388 389 390 391 392 393 394 395
    //===========================================================================

    public slots:
      /// set object marker for viewer
      void objectMarker (ViewObjectMarker* _marker) { objectMarker_ = _marker; emit updated(); }

      /// current object marker
      ViewObjectMarker* objectMarker() { return objectMarker_; };

    private:
      ViewObjectMarker *objectMarker_;

396 397 398 399 400 401 402 403 404
    //===========================================================================

    public:
      int currentViewingDirection();

      void currentViewingDirection(int _dir);

    private:
      int currentViewingDirection_;
405 406 407 408 409 410 411 412 413 414
      
    //===========================================================================

    public:
      bool rotationLocked();

      void rotationLocked(bool _lock);

    private:
      bool rotationLocked_;
Jan Möbius's avatar
Jan Möbius committed
415 416

    //===========================================================================
417

418
    /** @} */
419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434
    
    //===========================================================================
    //===========================================================================
    /** @name Projection controls and information
    * @{ */
    //===========================================================================
    //===========================================================================

    public:
      
      /// Get width of the gl scene in orthogonal projection mode (defaults to 2.0)
      double orthoWidth() { return orthoWidth_; };
      
      /// Set the width of the gl scene in orthogonal projection mode
      void orthoWidth(double _width){ orthoWidth_ = _width; emit updated(); };
      
435
      
436 437 438 439 440 441
      /// Return distance to near Plane
      double nearPlane(){ return nearPlane_;};
      
      /// set new near Plane distance
      void nearPlane(double _near){nearPlane_ = _near; emit updated(); };
      
442
      
443 444 445 446 447 448
      /// Return distance to far Plane
      double farPlane(){ return farPlane_;};
      
      /// set new near Plane distance
      void farPlane(double _far){farPlane_ = _far; emit updated(); };
      
449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476
      
      /// Get current scene center (rendering center)
      ACG::Vec3d sceneCenter(){ return sceneCenter_; };
      
      /// Set current scene center (rendering center)
      void sceneCenter(ACG::Vec3d _center){ sceneCenter_ = _center; emit updated(); };

      
      /// Get radius of the current scene
      double sceneRadius() {return sceneRadius_;};
      
      /// Set radius of the current scene
      void sceneRadius(double _radius ) { sceneRadius_ = _radius; emit updated();};
      
      
      /// Get virtual trackball center (rotation center when using mouse)
      ACG::Vec3d trackballCenter(){ return trackballCenter_; };
      
      /// Set virtual trackball center (rotation center when using mouse)
      void trackballCenter(ACG::Vec3d _center){ trackballCenter_ = _center; emit updated(); };
      
      
      /// Get trackball radius (rotation sphere when using mouse)
      double trackballRadius() {return trackballRadius_;};
      
      /// Set trackball radius   (rotation sphere when using mouse)
      void trackballRadius(double _radius ) { trackballRadius_ = _radius; emit updated();};
      
477 478 479 480 481 482 483 484 485 486
    private:
      
      /// Width of the gl scene in orthogonal mode ( defaults to 2.0 )
      double orthoWidth_;
      
      /// Distance to near Plane
      double nearPlane_;
      
      ///distance to far Plane
      double farPlane_;
487 488 489 490 491 492 493 494 495 496 497 498 499
      
      /// Current scene center (rendering center)
      ACG::Vec3d sceneCenter_;
      
      /// Radius of the current scene
      double sceneRadius_;
      
      /// Virtual trackball center (rotation center when using mouse)
      ACG::Vec3d trackballCenter_;
      
      /// trackball radius   (rotation sphere when using mouse)
      double trackballRadius_;
      
500 501
    /** @} */
    
Jan Möbius's avatar
 
Jan Möbius committed
502 503 504 505 506 507

    signals:
      /** \brief This signal is emitted when the configuration has been changed
      */
      void updated();

508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523
      void getPickMode(std::string& _mode );
      void setPickMode(const std::string  _mode );

      void getActionMode(Viewer::ActionMode& _am);
      void setActionMode(const Viewer::ActionMode  _am);

    public:

      /// get active pick mode
      std::string pickMode();

      /// set the pickMode
      void pickMode(const std::string _name);

      /// get the action mode
      Viewer::ActionMode actionMode();
524

525 526
      /// set active action mode
      void actionMode(const Viewer::ActionMode _am);
527

Jan Möbius's avatar
 
Jan Möbius committed
528 529 530 531 532
  };

}


533 534
#endif //VIEWERPROPERTIES_HH