/*===========================================================================*\ * * * OpenFlipper * * Copyright (C) 2001-2011 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 . * * * \*===========================================================================*/ /*===========================================================================*\ * * * $Revision$ * * $LastChangedBy$ * * $Date$ * * * \*===========================================================================*/ //============================================================================= // // Property storage Class for glWidgets // //============================================================================= /** * \file ViewerProperties.hh * This file contains a class for managing all viewer settings */ // #ifndef VIEWERPROPERTIES_HH #define VIEWERPROPERTIES_HH #include #include #include #include #include #include #include #include // forward declaration class ViewObjectMarker; namespace Viewer { /** \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. */ enum ActionMode { /** \brief Examine or Move mode * * In this mode no events are passed to the MouseInterface. * Only the viewer is active with mouse navigation. */ ExamineMode, /** \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 * */ PickingMode, /** \brief Question Mode * * In this mode the MouseInterface::slotMouseEventIdentify() function gets called * */ QuestionMode, /** \brief Light mode * * In this mode the MouseInterface::slotMouseEventLight() function is called */ LightMode }; class DLLEXPORT ViewerProperties : public QObject { Q_OBJECT public: ViewerProperties(int _id); ~ViewerProperties(); //=========================================================================== /** @name Draw Mode States * @{ */ //=========================================================================== public: /// set draw mode (No test if this mode is available!) void drawMode(ACG::SceneGraph::DrawModes::DrawMode _mode) { currentDrawMode_ = _mode; emit updated(); emit drawModeChanged(viewerId_); }; /// get current draw mode ACG::SceneGraph::DrawModes::DrawMode drawMode() { return currentDrawMode_; }; private: ACG::SceneGraph::DrawModes::DrawMode currentDrawMode_; /** @} */ //=========================================================================== /** @name Snapshot settings * @{ */ //=========================================================================== 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); /** Set the file type for snapshots. defaults to png" */ void snapshotFileType(const QString& _type); /** Set the start index for the snapshot counter */ void snapshotCounter(const int _counter){snapshotCounter_ = _counter;}; /** Get the file type for the current snapshot */ QString snapshotFileType() { return snapshotFileType_; }; /** 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_++; }; private: QString snapshotName_; QString snapshotFileType_; int snapshotCounter_; /** @} */ //=========================================================================== //=========================================================================== /** @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 void wheelZoomFactorShift(double _factor) { wZoomFactorShift_ = _factor; }; private: double wZoomFactor_; double wZoomFactorShift_; /** @} */ //=========================================================================== //=========================================================================== /** @name View Control * @{ */ //=========================================================================== //=========================================================================== /** @} */ //=========================================================================== //=========================================================================== /** @name Rendering Settings * @{ */ //=========================================================================== //=========================================================================== 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_; //=========================================================================== public slots: /// Get current background color ACG::Vec4f backgroundColor() { return backgroundColor_; } /// 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(); }; /// Get current background color QColor backgroundQColor(){ QColor c; c.setRedF( backgroundColor_[0]); c.setGreenF(backgroundColor_[1]); c.setBlueF( backgroundColor_[2]); c.setAlphaF(backgroundColor_[3]); return c; } /** Set background color. */ void backgroundColor( ACG::Vec4f _color ) { backgroundColor_ = _color; emit updated(); }; /** 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(); }; /** Set background color. */ void backgroundColor( QColor _color ) { backgroundColor_[0] = _color.redF(); backgroundColor_[1] = _color.greenF(); backgroundColor_[2] = _color.blueF(); backgroundColor_[3] = _color.alphaF(); emit updated(); }; private: ACG::Vec4f backgroundColor_; //=========================================================================== 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_; //=========================================================================== 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 void twoSidedLighting(bool _state ) { twoSidedLighting_ = _state; emit updated(); } /// is 2-sided lighing enabled? bool twoSidedLighting() { return twoSidedLighting_; }; private: bool twoSidedLighting_; //=========================================================================== public slots: /// set multisampling on/off void multisampling(bool _state ) { multisampling_ = _state; emit updated(); } /// is multisampling enabled? bool multisampling() { return multisampling_; }; private: 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_; //=========================================================================== 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_; //=========================================================================== 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_; //=========================================================================== 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_; //=========================================================================== public: int currentViewingDirection(); void currentViewingDirection(int _dir); private: int currentViewingDirection_; //=========================================================================== public: bool rotationLocked(); void rotationLocked(bool _lock); private: bool rotationLocked_; //=========================================================================== /** @} */ //=========================================================================== //=========================================================================== /** @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(); }; /// Return distance to near Plane double nearPlane(){ return nearPlane_;}; /// Set near and far plane at the same time void setPlanes( double _near, double _far ) {nearPlane_ = _near; farPlane_ = _far; emit updated();} ; /// Return distance to far Plane double farPlane(){ return farPlane_;}; /// 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();}; 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_; /// 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_; /** @} */ //=========================================================================== //=========================================================================== /** @name Stereo Settings * @{ */ //=========================================================================== //=========================================================================== public: void stereo(bool _stereo) { stereo_ = _stereo; emit updated(); }; bool stereo() {return stereo_; }; private: /// Flag if stereo should be enabled for the current viewer bool stereo_; /** @} */ //=========================================================================== //=========================================================================== /** @name Stereo Settings * @{ */ //=========================================================================== //=========================================================================== public: CursorPainter* cursorPainter() { return cursorPainter_; }; void cursorPainter( CursorPainter* _painter ) { cursorPainter_ = _painter; }; ACG::Vec3d cursorPoint3D() { return cursorPoint3D_; }; void cursorPoint3D(ACG::Vec3d _pos) { cursorPoint3D_ = _pos; }; bool cursorPositionValid() {return cursorPositionValid_; }; void cursorPositionValid(bool _valid) { cursorPositionValid_ = _valid; }; private: // Used to draw the current cursor in the scene CursorPainter *cursorPainter_; // position of the cursor picked into the scenegraph ACG::Vec3d cursorPoint3D_; // indicates that we successfully mapped the cursor into the scene bool cursorPositionValid_; /** @} */ signals: /** \brief This signal is emitted when the configuration has been changed * */ void updated(); /** \brief This signal is emitted when the drawmode changed * */ void drawModeChanged(int _viewerId ); 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(); /// set active action mode void actionMode(const Viewer::ActionMode _am); //=========================================================================== //=========================================================================== /** @name Viewer id handling * @{ */ //=========================================================================== //=========================================================================== /// Get the id of the viewer this viewerproperties belongs to int viewerId(); /// Set the id of the viewer this viewerproperties belongs to void viewerId(int _id); private: /// Stores the id of the viewer this property belongs to int viewerId_; /// String for the Settings storage QString settingsSection_; /** @} */ }; } #endif //VIEWERPROPERTIES_HH