ViewerProperties.hh 19 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
namespace Viewer {

75 76 77 78
  /** \brief Enum listing action modes of the viewers.
   *
   * These enums are used to control the reaction of the MouseInterface and the viewer on mouse events.
   */
Jan Möbius's avatar
 
Jan Möbius committed
79
  enum ActionMode {
80 81 82 83 84
    /** \brief Examine or Move mode
     *
     *  In this mode no events are passed to the MouseInterface.
     *  Only the viewer is active with mouse navigation.
     */
Jan Möbius's avatar
 
Jan Möbius committed
85
    ExamineMode,
86 87 88 89 90 91 92 93 94

    /** \brief Picking Mode
     *
     * In this mode the MouseInterface::slotMouseEvent() function gets called.
     *
     * The picking itself has to be performed by the plugins e.g. when implementing
     * \ref mouseInterfacePage
     *
     */
Jan Möbius's avatar
 
Jan Möbius committed
95
    PickingMode,
96 97 98 99 100 101

    /** \brief Question Mode
     *
     * In this mode the MouseInterface::slotMouseEventIdentify() function gets called
     *
     */
Jan Möbius's avatar
 
Jan Möbius committed
102
    QuestionMode,
103 104 105 106 107

    /** \brief Light mode
     *
     * In this mode the MouseInterface::slotMouseEventLight() function is called
     */
Jan Möbius's avatar
 
Jan Möbius committed
108 109 110
    LightMode
  };

Jan Möbius's avatar
Jan Möbius committed
111
  class DLLEXPORT ViewerProperties : public QObject {
Jan Möbius's avatar
 
Jan Möbius committed
112 113 114 115 116 117

    Q_OBJECT

    public:
      ViewerProperties();
      ~ViewerProperties();
118 119 120 121 122
      
    //===========================================================================
    /** @name Draw Mode States
     * @{ */
    //===========================================================================      
Jan Möbius's avatar
 
Jan Möbius committed
123

124 125
    public:
      /// set draw mode (No test if this mode is available!)
Jan Möbius's avatar
Jan Möbius committed
126
      void drawMode(ACG::SceneGraph::DrawModes::DrawMode _mode) { currentDrawMode_ = _mode; emit updated(); };
127 128
      
      /// get current draw mode
Jan Möbius's avatar
Jan Möbius committed
129
      ACG::SceneGraph::DrawModes::DrawMode drawMode() { return currentDrawMode_; };
130 131 132
      
    private:
      
Jan Möbius's avatar
Jan Möbius committed
133
      ACG::SceneGraph::DrawModes::DrawMode currentDrawMode_;
Jan Möbius's avatar
 
Jan Möbius committed
134

135 136
    /** @} */
      
Jan Möbius's avatar
 
Jan Möbius committed
137
    //===========================================================================
138
    /** @name Snapshot settings
Jan Möbius's avatar
 
Jan Möbius committed
139 140 141
    * @{ */
    //===========================================================================

142 143 144 145 146 147 148 149 150 151
    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);
152

153
      /** Set the file type for snapshots. defaults to png" */
154
      void snapshotFileType(const QString& _type);
155 156 157 158
      
      /** Set the start index for the snapshot counter */
      void snapshotCounter(const int _counter){snapshotCounter_ = _counter;};
      
Ellen Dekkers's avatar
Ellen Dekkers committed
159 160 161
      /** Get the file type for the current snapshot */
      QString snapshotFileType() { return snapshotFileType_; };
      
162 163 164 165 166
      /** 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
167

168 169
    private:
      QString                      snapshotName_;
170
      QString                      snapshotFileType_;
171
      int                          snapshotCounter_;
Jan Möbius's avatar
 
Jan Möbius committed
172 173 174

    /** @} */

175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
    //===========================================================================
    //===========================================================================
    /** @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
194
      void wheelZoomFactorShift(double _factor) { wZoomFactorShift_ = _factor; }; 
195 196 197 198 199 200 201 202

    private:
      double wZoomFactor_;

      double wZoomFactorShift_;

    /** @} */

203 204 205 206 207 208 209 210 211
    //===========================================================================
    //===========================================================================
    /** @name View Control
    * @{ */
    //===========================================================================
    //===========================================================================

    /** @} */

212
    //===========================================================================
213 214 215 216
    //===========================================================================
    /** @name Rendering Settings
    * @{ */
    //===========================================================================
217 218
    //===========================================================================

219 220 221 222 223 224 225 226 227 228 229 230 231
    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_;

232 233 234

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

235 236 237 238 239
    public slots:

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

Dirk Wilden's avatar
Dirk Wilden committed
240 241 242 243 244 245 246 247
      /// 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(); };

248 249 250 251
      /** Set background color.
      */
      void backgroundColor( ACG::Vec4f _color ) { backgroundColor_ = _color; emit updated(); };

Dirk Wilden's avatar
Dirk Wilden committed
252 253 254 255 256 257 258 259 260
      /** 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(); };

261 262 263
    private:
      ACG::Vec4f backgroundColor_;

264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282
    //===========================================================================

    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();
      }
283 284 285 286 287 288 289 290 291
      
      /** Render depth image or color image
      */
      bool renderDepthImage(){ return renderDepthImage_; };
     
      /** Render depth image or color image
      */
      void renderDepthImage(bool _depth){ renderDepthImage_ = _depth; emit updated(); };
      
292 293 294 295
    private:
      /** This variable controls if the scene is rendered in normal or in picking mode
      */
      bool renderPicking_;
296 297 298 299
      
      /** This variable controls if the depth image is rendered instead of the color image
      */
      bool renderDepthImage_;
300 301 302 303 304 305 306

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

307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333

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

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

334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350

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

    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
351
      void twoSidedLighting(bool _state ) { twoSidedLighting_ = _state; emit updated(); }
352 353 354 355 356 357

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

    private:
      bool twoSidedLighting_;
358 359 360 361 362 363 364 365 366 367 368
      
    //===========================================================================

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

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

    private:
369 370 371 372 373 374 375 376 377 378 379 380 381
      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_;
382 383 384 385 386 387 388 389 390 391 392 393 394

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

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

395

396 397 398 399 400 401 402 403 404 405 406 407
    //===========================================================================

    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
408 409 410 411 412 413 414 415 416 417 418 419
    //===========================================================================

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

420 421 422 423 424 425 426 427 428
    //===========================================================================

    public:
      int currentViewingDirection();

      void currentViewingDirection(int _dir);

    private:
      int currentViewingDirection_;
429 430 431 432 433 434 435 436 437 438
      
    //===========================================================================

    public:
      bool rotationLocked();

      void rotationLocked(bool _lock);

    private:
      bool rotationLocked_;
Jan Möbius's avatar
Jan Möbius committed
439 440

    //===========================================================================
441

442
    /** @} */
443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458
    
    //===========================================================================
    //===========================================================================
    /** @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(); };
      
459
      
460 461 462 463 464 465
      /// Return distance to near Plane
      double nearPlane(){ return nearPlane_;};
      
      /// set new near Plane distance
      void nearPlane(double _near){nearPlane_ = _near; emit updated(); };
      
466
      
467 468 469 470 471 472
      /// Return distance to far Plane
      double farPlane(){ return farPlane_;};
      
      /// set new near Plane distance
      void farPlane(double _far){farPlane_ = _far; emit updated(); };
      
473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500
      
      /// 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();};
      
501 502 503 504 505 506 507 508 509 510
    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_;
511 512 513 514 515 516 517 518 519 520 521 522 523
      
      /// 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_;
      
524 525
    /** @} */
    
Jan Möbius's avatar
 
Jan Möbius committed
526 527 528 529 530 531

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

532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547
      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();
548

549 550
      /// set active action mode
      void actionMode(const Viewer::ActionMode _am);
551

Jan Möbius's avatar
 
Jan Möbius committed
552 553 554 555 556
  };

}


557 558
#endif //VIEWERPROPERTIES_HH