ViewerProperties.hh 18.5 KB
Newer Older
1
/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
2 3
*                                                                            *
*                              OpenFlipper                                   *
Jan Möbius's avatar
Jan Möbius committed
4
*      Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen       *
Jan Möbius's avatar
Jan Möbius committed
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
*                           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
      /** Set the file type for snapshots. defaults to png" */
132
      void snapshotFileType(const QString& _type);
133 134 135 136
      
      /** Set the start index for the snapshot counter */
      void snapshotCounter(const int _counter){snapshotCounter_ = _counter;};
      
Ellen Dekkers's avatar
Ellen Dekkers committed
137 138 139
      /** Get the file type for the current snapshot */
      QString snapshotFileType() { return snapshotFileType_; };
      
140 141 142 143 144
      /** 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
145

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

    /** @} */

153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
    //===========================================================================
    //===========================================================================
    /** @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
172
      void wheelZoomFactorShift(double _factor) { wZoomFactorShift_ = _factor; }; 
173 174 175 176 177 178 179 180

    private:
      double wZoomFactor_;

      double wZoomFactorShift_;

    /** @} */

181 182 183 184 185 186 187 188 189
    //===========================================================================
    //===========================================================================
    /** @name View Control
    * @{ */
    //===========================================================================
    //===========================================================================

    /** @} */

190
    //===========================================================================
191 192 193 194
    //===========================================================================
    /** @name Rendering Settings
    * @{ */
    //===========================================================================
195 196
    //===========================================================================

197 198 199 200 201 202 203 204 205 206 207 208 209
    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_;

210 211 212

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

213 214 215 216 217
    public slots:

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

Dirk Wilden's avatar
Dirk Wilden committed
218 219 220 221 222 223 224 225
      /// 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(); };

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

Dirk Wilden's avatar
Dirk Wilden committed
230 231 232 233 234 235 236 237 238
      /** 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(); };

239 240 241
    private:
      ACG::Vec4f backgroundColor_;

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

    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();
      }
261 262 263 264 265 266 267 268 269
      
      /** Render depth image or color image
      */
      bool renderDepthImage(){ return renderDepthImage_; };
     
      /** Render depth image or color image
      */
      void renderDepthImage(bool _depth){ renderDepthImage_ = _depth; emit updated(); };
      
270 271 272 273
    private:
      /** This variable controls if the scene is rendered in normal or in picking mode
      */
      bool renderPicking_;
274 275 276 277
      
      /** This variable controls if the depth image is rendered instead of the color image
      */
      bool renderDepthImage_;
278 279 280 281 282 283 284

      /** 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_;

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 310 311

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

    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_;

312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328

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

    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
329
      void twoSidedLighting(bool _state ) { twoSidedLighting_ = _state; emit updated(); }
330 331 332 333 334 335

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

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

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

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

    private:
347 348 349 350 351 352 353 354 355 356 357 358 359
      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_;
360 361 362 363 364 365 366 367 368 369 370 371 372

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

    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_;

373

374 375 376 377 378 379 380 381 382 383 384 385
    //===========================================================================

    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
386 387 388 389 390 391 392 393 394 395 396 397
    //===========================================================================

    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_;

398 399 400 401 402 403 404 405 406
    //===========================================================================

    public:
      int currentViewingDirection();

      void currentViewingDirection(int _dir);

    private:
      int currentViewingDirection_;
407 408 409 410 411 412 413 414 415 416
      
    //===========================================================================

    public:
      bool rotationLocked();

      void rotationLocked(bool _lock);

    private:
      bool rotationLocked_;
Jan Möbius's avatar
Jan Möbius committed
417 418

    //===========================================================================
419

420
    /** @} */
421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436
    
    //===========================================================================
    //===========================================================================
    /** @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(); };
      
437
      
438 439 440 441 442 443
      /// Return distance to near Plane
      double nearPlane(){ return nearPlane_;};
      
      /// set new near Plane distance
      void nearPlane(double _near){nearPlane_ = _near; emit updated(); };
      
444
      
445 446 447 448 449 450
      /// Return distance to far Plane
      double farPlane(){ return farPlane_;};
      
      /// set new near Plane distance
      void farPlane(double _far){farPlane_ = _far; emit updated(); };
      
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 477 478
      
      /// 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();};
      
479 480 481 482 483 484 485 486 487 488
    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_;
489 490 491 492 493 494 495 496 497 498 499 500 501
      
      /// 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_;
      
502 503
    /** @} */
    
Jan Möbius's avatar
 
Jan Möbius committed
504 505 506 507 508 509

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

510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525
      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();
526

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

Jan Möbius's avatar
 
Jan Möbius committed
530 531 532 533 534
  };

}


535 536
#endif //VIEWERPROPERTIES_HH