//=============================================================================
//
// OpenFlipper
// Copyright (C) 2008 by Computer Graphics Group, RWTH Aachen
// www.openflipper.org
//
//-----------------------------------------------------------------------------
//
// License
//
// 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.
//
// 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 Lesser General Public License
// along with OpenFlipper. If not, see .
//
//-----------------------------------------------------------------------------
//
// $Revision: 4482 $
// $Author: moebius $
// $Date: 2009-01-28 11:12:14 +0100 (Mi, 28. Jan 2009) $
//
//=============================================================================
//=============================================================================
//
// 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
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
};
class DLLEXPORT ViewerProperties : public QObject {
Q_OBJECT
public:
ViewerProperties();
~ViewerProperties();
//===========================================================================
/** @name Action Mode States
* @{ */
//===========================================================================
public slots:
bool examineMode() { return(actionMode_ == Viewer::ExamineMode ); };
bool pickingMode() { return(actionMode_ == Viewer::PickingMode ); };
bool lightMode() { return(actionMode_ == Viewer::LightMode ); };
bool questionMode(){ return(actionMode_ == Viewer::QuestionMode ); };
/** Set action mode.
The ActionMode determines the type of reaction on mouse events.
*/
void setExamineMode() { actionMode(Viewer::ExamineMode ); };
void setPickingMode() { actionMode(Viewer::PickingMode ); };
void setLightMode() { actionMode(Viewer::LightMode ); };
void setQuestionMode(){ actionMode(Viewer::QuestionMode ); };
public:
void actionMode(Viewer::ActionMode _am);
Viewer::ActionMode actionMode() { return actionMode_; };
Viewer::ActionMode lastActionMode() { return lastActionMode_; };
private :
Viewer::ActionMode actionMode_, lastActionMode_;
/** @} */
//===========================================================================
/** @name Snapshot settings
* @{ */
//===========================================================================
public slots:
/** Set the base file name and reset the counter for snapshots.
The image file format is determined from the file name extension,
the \a QImageIO formats are supported (e.g. ".ppm" [raw], ".png").
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);
/** 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_;
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(); };
/** 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(); };
private:
ACG::Vec4f backgroundColor_;
//===========================================================================
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();
}
private:
/** This variable controls if the scene is rendered in normal or in picking mode
*/
bool renderPicking_;
/** 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_;
//===========================================================================
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; glState_->set_twosided_lighting( _state ); emit updated(); }
/// is 2-sided lighing enabled?
bool twoSidedLighting() { return twoSidedLighting_; };
private:
bool twoSidedLighting_;
//===========================================================================
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_;
/** @} */
signals:
/** \brief This signal is emitted when the configuration has been changed
*/
void updated();
void actionModeChanged( Viewer::ActionMode );
};
}
#endif //VIEWERPROPERTIES_HH