PluginFunctions.cc

00001 /*===========================================================================*\
00002  *                                                                           *
00003  *                              OpenFlipper                                  *
00004  *      Copyright (C) 2001-2009 by Computer Graphics Group, RWTH Aachen      *
00005  *                           www.openflipper.org                             *
00006  *                                                                           *
00007  *---------------------------------------------------------------------------*
00008  *  This file is part of OpenFlipper.                                        *
00009  *                                                                           *
00010  *  OpenFlipper is free software: you can redistribute it and/or modify      *
00011  *  it under the terms of the GNU Lesser General Public License as           *
00012  *  published by the Free Software Foundation, either version 3 of           *
00013  *  the License, or (at your option) any later version with the              *
00014  *  following exceptions:                                                    *
00015  *                                                                           *
00016  *  If other files instantiate templates or use macros                       *
00017  *  or inline functions from this file, or you compile this file and         *
00018  *  link it with other files to produce an executable, this file does        *
00019  *  not by itself cause the resulting executable to be covered by the        *
00020  *  GNU Lesser General Public License. This exception does not however       *
00021  *  invalidate any other reasons why the executable file might be            *
00022  *  covered by the GNU Lesser General Public License.                        *
00023  *                                                                           *
00024  *  OpenFlipper is distributed in the hope that it will be useful,           *
00025  *  but WITHOUT ANY WARRANTY; without even the implied warranty of           *
00026  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            *
00027  *  GNU Lesser General Public License for more details.                      *
00028  *                                                                           *
00029  *  You should have received a copy of the GNU LesserGeneral Public          *
00030  *  License along with OpenFlipper. If not,                                  *
00031  *  see <http://www.gnu.org/licenses/>.                                      *
00032  *                                                                           *
00033 \*===========================================================================*/
00034 
00035 /*===========================================================================*\
00036  *                                                                           *
00037  *   $Revision: 7453 $                                                         *
00038  *   $Author: moebius $                                                      *
00039  *   $Date: 2009-10-16 16:02:23 +0200 (Fr, 16. Okt 2009) $                   *
00040  *                                                                           *
00041 \*===========================================================================*/
00042 
00043 
00044 
00045 
00046 //=============================================================================
00047 //
00048 //  Plugin Functions
00049 //
00050 //=============================================================================
00051 
00052 #include <OpenFlipper/common/Types.hh>
00053 #include <QGLWidget>
00054 
00055 #include "PluginFunctions.hh"
00056 #include "PluginFunctionsCore.hh"
00057 
00058 namespace PluginFunctions {
00059 
00064 static BaseObject* objectRoot_;
00065 
00070 static std::vector< glViewer* > examiner_widgets_;
00071 
00076 static std::vector< Viewer::ViewerProperties* > viewerProperties_;
00077 
00079 static glViewer*  examiner_widget_;
00080 
00082 static unsigned int activeExaminer_ = 0;
00083 
00090 static SeparatorNode* dataRootNode_ = 0;
00091 
00095 static SeparatorNode* dataSeparatorNode_ = 0;
00096 
00099 static SeparatorNode* sceneGraphRootNode_ = 0;
00100 
00104 static Viewer::ViewerProperties dummyProperties;
00105 
00106 
00111 static ViewObjectMarker* defaultMarker_ = 0;
00112 
00117 static QGLWidget* shareGLWidget_ = 0;
00118 
00121 static int viewerId_ = 0;
00122 
00123 void setDataRoot( BaseObject* _root ) {
00124    objectRoot_ = _root;
00125 }
00126 
00127 int viewers( ) {
00128   return examiner_widgets_.size();
00129 }
00130 
00131 int viewerId() {
00132   return viewerId_;
00133 }
00134 
00135 void setViewers( std::vector< glViewer* > _viewerWidgets ) {
00136    PluginFunctions::examiner_widgets_ = _viewerWidgets;
00137    PluginFunctions::examiner_widget_ =  examiner_widgets_[0];
00138 
00139    // Generate a (hopefully) unique viewer id
00140    QTime time = QTime::currentTime();
00141    qsrand( time.hour() * 10 + time.minute() * 100 + time.second() * 1000 + time.msec() * 10000  );
00142    viewerId_ = qrand();
00143 }
00144 
00145 void setViewerProperties( std::vector< Viewer::ViewerProperties* > _viewerProperties ) {
00146    PluginFunctions::viewerProperties_ = _viewerProperties;
00147 }
00148 
00149 void setActiveExaminer( const unsigned int _id ) {
00150   activeExaminer_ = _id;
00151 }
00152 
00153 glViewer* viewer(int  _viewerId ) {
00154    if ( _viewerId < 0 || _viewerId >= (int)examiner_widgets_.size() ) {
00155      std::cerr << "Requested unknown viewer with id : " << _viewerId << std::endl;
00156      return examiner_widgets_[activeExaminer()];
00157    }
00158 
00159    return( examiner_widgets_[_viewerId] );
00160 }
00161 
00162 unsigned int activeExaminer( ) {
00163   return activeExaminer_;
00164 }
00165 
00166 QString getEncodedExaminerView() {
00167   return getEncodedExaminerView(activeExaminer());
00168 }
00169 
00171 QString getEncodedExaminerView(int _viewerId) {
00172 
00173   QString view;
00174 
00175   if ( _viewerId < 0 || _viewerId >= (int)examiner_widgets_.size() ) {
00176      std::cerr << "Requested unknown viewer with id : " << _viewerId << std::endl;
00177      examiner_widgets_[activeExaminer()]->encodeView ( view );
00178      return view;
00179   }
00180 
00181   examiner_widgets_[_viewerId]->encodeView ( view );
00182   return view;
00183 
00184 }
00185 
00186 void setEncodedExaminerView( QString _view ) {
00187   setEncodedExaminerView( activeExaminer() , _view );
00188 }
00189 
00190 void setEncodedExaminerView(int _viewerId , QString _view ) {
00191 
00192   if ( _viewerId < 0 || _viewerId >= (int)examiner_widgets_.size() ) {
00193      std::cerr << "Requested unknown viewer with id : " << _viewerId << std::endl;
00194      examiner_widgets_[activeExaminer()]->decodeView ( _view );
00195   }
00196 
00197   examiner_widgets_[_viewerId]->decodeView ( _view );
00198 }
00199 
00200 void setDataSeparatorNodes( SeparatorNode* _dataSeparatorNode ) {
00201   
00202   // The function should only be called once by the core. 
00203 
00204   // Set the separatorNode
00205   PluginFunctions::dataSeparatorNode_ = _dataSeparatorNode;
00206 
00207   
00208   if ( PluginFunctions::dataSeparatorNode_->nChildren() != 1 ){
00209     std::cerr << "Only one child allowed for dataSeparatorNode on initialization!" << std::endl;
00210     std::cerr << "The Core has initialized the scenegraph in a strange way!" << std::endl;
00211     ACG::SceneGraph::BaseNode* child = *(PluginFunctions::dataSeparatorNode_->childrenBegin());
00212   }
00213   
00214   // Set the root node for the data objects
00215   // which has to be a child of the dataSeparatorNode_
00216   PluginFunctions::dataRootNode_ = dynamic_cast<ACG::SceneGraph::SeparatorNode*> (*(PluginFunctions::dataSeparatorNode_->childrenBegin()) );
00217   
00218 }
00219 
00220 void setSceneGraphRootNode( SeparatorNode* _root_node ) {
00221    PluginFunctions::sceneGraphRootNode_ = _root_node;
00222 }
00223 
00224 bool getPickedObject(const unsigned int _node_idx , BaseObjectData*& _object) {
00225   for ( ObjectIterator o_it(PluginFunctions::ALL_OBJECTS) ; o_it != PluginFunctions::objectsEnd(); ++o_it) {
00226     if ( o_it->picked( _node_idx ) ) {
00227       _object = *o_it;
00228       return true;
00229     }
00230   }
00231   return false;
00232 }
00233 
00234 
00235 bool getSourceIdentifiers( std::vector<int>& _identifiers  ) {
00236   _identifiers.clear();
00237 
00238   for ( ObjectIterator o_it(PluginFunctions::ALL_OBJECTS) ; o_it != PluginFunctions::objectsEnd(); ++o_it) {
00239     if ( o_it->source() )
00240       _identifiers.push_back ( o_it->id() );
00241   }
00242   return (_identifiers.size() >0 );
00243 }
00244 
00245 bool getTargetIdentifiers( std::vector<int>& _identifiers  ) {
00246   _identifiers.clear();
00247 
00248   for ( ObjectIterator o_it(PluginFunctions::ALL_OBJECTS) ; o_it != PluginFunctions::objectsEnd(); ++o_it) {
00249     if ( o_it->target() )
00250       _identifiers.push_back ( o_it->id() );
00251   }
00252   return (_identifiers.size() >0 );
00253 }
00254 
00255 // ===============================================================================
00256 // Get objects
00257 // ===============================================================================
00258 
00259 bool getObject(  const int _identifier , BaseObject*& _object ) {
00260 
00261   if ( _identifier == -1 )
00262     return false;
00263 
00264   _object = objectRoot_->childExists( _identifier );
00265   return ( _object != 0 );
00266 }
00267 
00268 bool getObject(  const int _identifier , BaseObjectData*& _object ) {
00269 
00270   if ( _identifier == -1 )
00271     return false;
00272 
00273   BaseObject* object = objectRoot_->childExists( _identifier );
00274   _object = dynamic_cast< BaseObjectData* >(object);
00275   return ( _object != 0 );
00276 }
00277 
00278 int getObjectId( const QString _name ) {
00279 
00280         if(_name.isEmpty()) return -1;
00281 
00282         BaseObject* object = objectRoot_->childExists( _name );
00283         return object->id();
00284 }
00285 
00286 // ===============================================================================
00287 // ===============================================================================
00288 
00289 bool object_exists(  const int _identifier ) {
00290 
00291   if ( _identifier == -1 )
00292     return false;
00293 
00294   BaseObject* object = objectRoot_->childExists( _identifier );
00295   return ( object != 0 );
00296 }
00297 
00298 //===============================================================================
00299 
00300 bool getAllMeshes( std::vector<int>& _identifiers  ) {
00301 
00302   _identifiers.clear();
00303 
00304   // find changed manipulator
00305   for ( PluginFunctions::ObjectIterator o_it(PluginFunctions::ALL_OBJECTS,DATA_TRIANGLE_MESH) ;
00306                                         o_it != PluginFunctions::objectsEnd(); ++o_it)  {
00307     _identifiers.push_back( o_it->id() );
00308   }
00309 
00310   return (_identifiers.size() > 0);
00311 }
00312 
00313 bool get_all_object_identifiers( std::vector<int>& _identifiers  ) {
00314 
00315   _identifiers.clear();
00316 
00317   // find changed manipulator
00318   for ( PluginFunctions::ObjectIterator o_it(PluginFunctions::ALL_OBJECTS) ;
00319                                         o_it != PluginFunctions::objectsEnd(); ++o_it)  {
00320     _identifiers.push_back( o_it->id() );
00321   }
00322 
00323   return (_identifiers.size() > 0);
00324 }
00325 
00326 void setBackColor( OpenMesh::Vec4f _color) {
00327   for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00328     PluginFunctions::viewerProperties(i).backgroundColor(_color);
00329 }
00330 
00331 void setFixedView(int _mode, int _viewer ) {
00332 
00333   if ( (_viewer != ACTIVE_VIEWER ) && ( ( _viewer < 0 ) || _viewer >= (int)examiner_widgets_.size()) ){
00334     std::cerr << "Unable to set fixed view. Wrong viewer id (" << _viewer << ")" << std::endl;
00335     return;
00336   }
00337 
00338   switch ( _mode ){
00339     case VIEW_TOP : //TOP
00340       PluginFunctions::viewingDirection( ACG::Vec3d(0.0, -1.0, 0.0), ACG::Vec3d(0.0, 0.0, -1.0), _viewer );
00341       PluginFunctions::allowRotation(false, _viewer);
00342       break;
00343     case VIEW_BOTTOM : //BOTTOM
00344       PluginFunctions::viewingDirection( ACG::Vec3d(0.0, 1.0, 0.0), ACG::Vec3d(0.0, 0.0, -1.0), _viewer );
00345       PluginFunctions::allowRotation(false, _viewer);
00346       break;
00347     case VIEW_LEFT : //LEFT
00348       PluginFunctions::viewingDirection( ACG::Vec3d(1.0, 0.0, 0.0), ACG::Vec3d(0.0, 1.0, 0.0), _viewer );
00349       PluginFunctions::allowRotation(false, _viewer);
00350       break;
00351     case VIEW_RIGHT : //RIGHT
00352       PluginFunctions::viewingDirection( ACG::Vec3d(-1.0, 0.0, 0.0), ACG::Vec3d(0.0, 1.0, 0.0), _viewer );
00353       PluginFunctions::allowRotation(false, _viewer);
00354       break;
00355     case VIEW_FRONT : //FRONT
00356       PluginFunctions::viewingDirection( ACG::Vec3d(0.0, 0.0, -1.0), ACG::Vec3d(0.0, 1.0, 0.0), _viewer );
00357       PluginFunctions::allowRotation(false, _viewer);
00358       break;
00359     case VIEW_BACK : //BACK
00360       PluginFunctions::viewingDirection( ACG::Vec3d(0.0, 0.0, 1.0), ACG::Vec3d(0.0, 1.0, 0.0), _viewer );
00361       PluginFunctions::allowRotation(false, _viewer);
00362       break;
00363     default : //Free View
00364       PluginFunctions::allowRotation(true, _viewer);
00365       break;
00366   }
00367 
00368   if ( _viewer == ACTIVE_VIEWER )
00369     viewerProperties(activeExaminer()).currentViewingDirection( _mode );
00370   else
00371     viewerProperties( _viewer ).currentViewingDirection( _mode );
00372 }
00373 
00374 QPoint mapToGlobal(const QPoint _point ) {
00375   return examiner_widgets_[activeExaminer_]->glMapToGlobal(_point);
00376 }
00377 
00378 QPoint mapToLocal( const QPoint _point ) {
00379   return examiner_widgets_[activeExaminer_]->glMapFromGlobal(_point);
00380 }
00381 
00382 void setDrawMode( const unsigned int _mode , int _viewer) {
00383 
00384   if ( _viewer == ACTIVE_VIEWER )
00385     viewerProperties(activeExaminer()).drawMode(_mode);
00386   else if ( _viewer == ALL_VIEWERS )
00387     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00388       viewerProperties(i).drawMode(_mode);
00389   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00390     viewerProperties(_viewer).drawMode(_mode);
00391   else
00392     std::cerr << "Requested illegal viewer for setting DrawMode!!" << std::endl;
00393 
00394 }
00395 
00401 unsigned int drawMode( int _viewer ) {
00402   if ( _viewer == ACTIVE_VIEWER ) {
00403     return viewerProperties(activeExaminer()).drawMode();
00404   } else if ( _viewer == ALL_VIEWERS )
00405     std::cerr << "Please select viewer to get viewing direction!" << std::endl;
00406   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00407     return viewerProperties(_viewer).drawMode();
00408   else
00409     std::cerr << "Requested illegal viewer for viewingDirection!!" << std::endl;
00410 
00411   return viewerProperties(activeExaminer()).drawMode();
00412 }
00413 
00414 bool scenegraphPick( ACG::SceneGraph::PickTarget _pickTarget, const QPoint &_mousePos, unsigned int &_nodeIdx, unsigned int &_targetIdx, ACG::Vec3d *_hitPointPtr=0 ) {
00415 
00416    return examiner_widgets_[activeExaminer_]->pick( _pickTarget,_mousePos,_nodeIdx,_targetIdx,_hitPointPtr );
00417 }
00418 
00419 bool scenegraphPick( const unsigned int _examiner, ACG::SceneGraph::PickTarget _pickTarget, const QPoint &_mousePos, unsigned int &_nodeIdx, unsigned int &_targetIdx, ACG::Vec3d *_hitPointPtr=0 ) {
00420 
00421   if ( _examiner >= examiner_widgets_.size() ) {
00422     std::cerr << "Wrong examiner id" << std::endl;
00423     return false;
00424   }
00425   return examiner_widgets_[_examiner]->pick( _pickTarget,_mousePos,_nodeIdx,_targetIdx,_hitPointPtr );
00426 }
00427 
00428 bool scenegraphRegionPick( ACG::SceneGraph::PickTarget                _pickTarget,
00429                            const QRegion&                             _region,
00430                            QList<QPair<unsigned int, unsigned int> >& _list)
00431 {
00432   return examiner_widgets_[activeExaminer_]->pick_region( _pickTarget, _region, _list);
00433 }
00434 
00435 bool scenegraphRegionPick( const unsigned int                         _examiner,
00436                            ACG::SceneGraph::PickTarget                _pickTarget,
00437                            const QRegion&                             _region,
00438                            QList<QPair<unsigned int, unsigned int> >& _list)
00439 {
00440   if ( _examiner >= examiner_widgets_.size() ) {
00441     std::cerr << "Wrong examiner id" << std::endl;
00442     return false;
00443   }
00444   return examiner_widgets_[_examiner]->pick_region( _pickTarget, _region, _list);
00445 }
00446 
00447 
00448 
00449 //Warning : Dont use template function as external static pointer for examiner widget is not resolved correctly!!
00450 void traverse( ACG::SceneGraph::MouseEventAction  &_action ) {
00451    ACG::SceneGraph::traverse(sceneGraphRootNode_,
00452                              _action,viewerProperties().glState() );
00453 }
00454 
00455 //Warning : Dont use template function as external static pointer for examiner widget is not resolved correctly!!
00456 void traverse( const unsigned int _examiner, ACG::SceneGraph::MouseEventAction  &_action ) {
00457 
00458   if ( _examiner >= examiner_widgets_.size() ) {
00459     std::cerr << "Wrong examiner id" << std::endl;
00460     return;
00461   }
00462 
00463   ACG::SceneGraph::traverse(sceneGraphRootNode_, _action,viewerProperties(_examiner).glState() );
00464 }
00465 
00466 
00467 const std::string pickMode () {
00468   // No seperate draw modes available all should have the same so take first
00469   return viewerProperties().pickMode();
00470 }
00471 
00472 void pickMode ( std::string _mode) {
00473   // switch to default marker
00474   setViewObjectMarker (defaultViewObjectMarker ());
00475   viewerProperties().pickMode(_mode);
00476 }
00477 
00478 Viewer::ActionMode actionMode() {
00479    return viewerProperties().actionMode();
00480 }
00481 
00482 void actionMode ( Viewer::ActionMode _mode) {
00483 
00484   viewerProperties().actionMode(_mode);
00485 }
00486 
00487 void shareGLWidget (QGLWidget *_widget)
00488 {
00489   shareGLWidget_ = _widget;
00490 }
00491 
00492 QGLWidget *shareGLWidget ()
00493 {
00494   return shareGLWidget_;
00495 }
00496 
00497 void getCurrentViewImage(QImage& _image) {
00498   viewer( activeExaminer() )->snapshot( _image, true );
00499 }
00500 
00501 Viewer::ViewerProperties& viewerProperties(int _id) {
00502   if ( _id >= (int)viewerProperties_.size() ) {
00503     std::cerr << " Error, requested properties for non-existing Viewer!" << std::endl;
00504     return dummyProperties;
00505   }
00506 
00507   if ( _id == -1 )
00508     _id = activeExaminer_;
00509 
00510   return ( *viewerProperties_[_id] );
00511 
00512 }
00513 
00514 void perspectiveProjection( int _viewer ) {
00515   if ( _viewer == ACTIVE_VIEWER ) {
00516     examiner_widgets_[activeExaminer_]->perspectiveProjection();
00517   } else if ( _viewer == ALL_VIEWERS )
00518     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00519       examiner_widgets_[i]->perspectiveProjection();
00520   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00521     examiner_widgets_[_viewer]->perspectiveProjection();
00522   else
00523     std::cerr << "Requested illegal viewer for perspectiveProjection()!!" << std::endl;
00524 }
00525 
00526 void orthographicProjection( int _viewer ) {
00527   if ( _viewer == ACTIVE_VIEWER ) {
00528     examiner_widgets_[activeExaminer_]->orthographicProjection();
00529   } else if ( _viewer == ALL_VIEWERS )
00530     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00531       examiner_widgets_[i]->orthographicProjection();
00532   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00533     examiner_widgets_[_viewer]->orthographicProjection();
00534   else
00535     std::cerr << "Requested illegal viewer for orthographicProjection()!!" << std::endl;
00536 }
00537 
00538 void allowRotation(bool _mode, int _viewer ) {
00539   if ( _viewer == ACTIVE_VIEWER ) {
00540     examiner_widgets_[activeExaminer_]->allowRotation(_mode);
00541   } else if ( _viewer == ALL_VIEWERS )
00542     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00543       examiner_widgets_[i]->allowRotation(_mode);
00544   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00545     examiner_widgets_[_viewer]->allowRotation(_mode);
00546   else
00547     std::cerr << "Requested illegal viewer for allowRotation!!" << std::endl;
00548 }
00549 
00550 bool allowRotation( int _viewer ) {
00551 
00552   if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00553     return examiner_widgets_[_viewer]->allowRotation();
00554   else {
00555 
00556     std::cerr << "Requested illegal viewer for isRotationAllowed!!" << std::endl;
00557     return false;
00558   }
00559 }
00560 
00561 void setMainGLContext() {
00562   examiner_widget_->makeCurrent();
00563 }
00564 
00565 void viewingDirection(const ACG::Vec3d &_dir, const ACG::Vec3d &_up , int _viewer ) {
00566   if ( _viewer == ACTIVE_VIEWER ) {
00567     examiner_widgets_[activeExaminer_]->viewingDirection(_dir,_up);
00568   } else if ( _viewer == ALL_VIEWERS )
00569     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00570       examiner_widgets_[i]->viewingDirection(_dir,_up);
00571   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00572     examiner_widgets_[_viewer]->viewingDirection(_dir,_up);
00573   else
00574     std::cerr << "Requested illegal viewer for viewingDirection!!" << std::endl;
00575 }
00576 
00577 const ACG::Vec3d trackBallCenter(const ACG::Vec3d& _center, int _viewer ) {
00578   if ( _viewer == ACTIVE_VIEWER ) {
00579     return examiner_widgets_[activeExaminer_]->trackBallCenter();
00580   } else if ( _viewer == ALL_VIEWERS )
00581     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00582       return examiner_widgets_[i]->trackBallCenter(  );
00583     else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00584       return examiner_widgets_[_viewer]->trackBallCenter(  );
00585     else
00586       std::cerr << "Requested illegal viewer for setTrackBallCenter!!" << std::endl;
00587 
00588   return examiner_widgets_[activeExaminer_]->trackBallCenter();
00589 }
00590 
00591 void setTrackBallCenter(const ACG::Vec3d& _center, int _viewer ) {
00592   if ( _viewer == ACTIVE_VIEWER ) {
00593     examiner_widgets_[activeExaminer_]->setTrackBallCenter( _center );
00594   } else if ( _viewer == ALL_VIEWERS )
00595     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00596       examiner_widgets_[i]->setTrackBallCenter( _center );
00597     else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00598       examiner_widgets_[_viewer]->setTrackBallCenter( _center );
00599     else
00600       std::cerr << "Requested illegal viewer for setTrackBallCenter!!" << std::endl;
00601 }
00602 
00603 void setScenePos(const ACG::Vec3d& _center,const double _radius, int _viewer ) {
00604   if ( _viewer == ACTIVE_VIEWER ) {
00605     examiner_widgets_[activeExaminer_]->setScenePos( _center, _radius );
00606   } else if ( _viewer == ALL_VIEWERS )
00607     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00608       examiner_widgets_[i]->setScenePos( _center, _radius );
00609   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00610     examiner_widgets_[_viewer]->setScenePos( _center, _radius );
00611   else
00612     std::cerr << "Requested illegal viewer for setScenePos!!" << std::endl;
00613 }
00614 
00615 void setScenePos(const ACG::Vec3d& _center, int _viewer ) {
00616   if ( _viewer == ACTIVE_VIEWER ) {
00617     examiner_widgets_[activeExaminer_]->setScenePos( _center, examiner_widgets_[activeExaminer_]->scene_radius() );
00618   } else if ( _viewer == ALL_VIEWERS )
00619     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00620       examiner_widgets_[i]->setScenePos( _center, examiner_widgets_[i]->scene_radius() );
00621   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00622     examiner_widgets_[_viewer]->setScenePos( _center, examiner_widgets_[_viewer]->scene_radius() );
00623   else
00624     std::cerr << "Requested illegal viewer for setScenePos!!" << std::endl;
00625 }
00626 
00627 void setSceneCenter(const ACG::Vec3d& _center, int _viewer) {
00628 
00629         if (_viewer == ACTIVE_VIEWER) {
00630 
00631                 examiner_widgets_[activeExaminer_]->setSceneCenter(_center);
00632         } else if (_viewer == ALL_VIEWERS) {
00633 
00634                 for (uint i = 0; i < examiner_widgets_.size(); ++i) {
00635 
00636                         examiner_widgets_[i]->setSceneCenter(_center);
00637                 }
00638         } else if ((_viewer >= 0) && _viewer < (int) examiner_widgets_.size()) {
00639 
00640                 examiner_widgets_[_viewer]->setSceneCenter(_center);
00641         } else {
00642                 std::cerr << "Requested illegal viewer for setSceneCenter!!"
00643                                 << std::endl;
00644         }
00645 }
00646 
00647 const ACG::Vec3d& sceneCenter(int _viewer) {
00648 
00649         if (_viewer == ACTIVE_VIEWER) {
00650                 return examiner_widgets_[activeExaminer_]->scene_center();
00651         } else if (_viewer == ALL_VIEWERS)
00652                 std::cerr << "Please select viewer to get viewing direction!"
00653                                 << std::endl;
00654         else if ((_viewer >= 0) && _viewer < (int) examiner_widgets_.size())
00655                 return examiner_widgets_[_viewer]->scene_center();
00656         else
00657                 std::cerr << "Requested illegal viewer for sceneCenter!!" << std::endl;
00658 
00659         return examiner_widgets_[activeExaminer_]->scene_center();
00660 }
00661 
00662 double sceneRadius() {
00663    return examiner_widgets_[activeExaminer_]->scene_radius();
00664 }
00665 
00666 double sceneRadius( int _viewer ) {
00667   if ( _viewer == ACTIVE_VIEWER ) {
00668     return examiner_widgets_[activeExaminer_]->scene_radius();
00669   } else if ( _viewer == ALL_VIEWERS )
00670     std::cerr << "Illegal request for scene radius. Please select one viewer!" << std::endl;
00671   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00672     return examiner_widgets_[_viewer]->scene_radius();
00673   else
00674     std::cerr << "Requested illegal viewer for translate!!" << std::endl;
00675 
00676   return -1;
00677 }
00678 
00679 void translate( const ACG::Vec3d &_vector , int _viewer ) {
00680   if ( _viewer == ACTIVE_VIEWER ) {
00681     examiner_widgets_[activeExaminer_]->translate(_vector);
00682   } else if ( _viewer == ALL_VIEWERS )
00683     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00684       examiner_widgets_[i]->translate(_vector);
00685   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00686     examiner_widgets_[_viewer]->translate(_vector);
00687   else
00688     std::cerr << "Requested illegal viewer for translate!!" << std::endl;
00689 }
00690 
00691 void rotate(const ACG::Vec3d&  _axis,
00692             const double       _angle,
00693             const ACG::Vec3d&  _center,
00694             int                _viewer )
00695 {
00696   if ( _viewer == ACTIVE_VIEWER ) {
00697     examiner_widgets_[activeExaminer_]->rotate(_axis,_angle,_center);
00698   } else if ( _viewer == ALL_VIEWERS )
00699     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00700       examiner_widgets_[i]->rotate(_axis,_angle,_center);
00701   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00702     examiner_widgets_[_viewer]->rotate(_axis,_angle,_center);
00703   else
00704     std::cerr << "Requested illegal viewer for rotate!!" << std::endl;
00705 }
00706 
00707 void viewHome(int _viewer) {
00708   if ( _viewer == ACTIVE_VIEWER ) {
00709     examiner_widgets_[activeExaminer_]->home();
00710   } else if ( _viewer == ALL_VIEWERS )
00711     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00712       examiner_widgets_[i]->home();
00713   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00714     examiner_widgets_[_viewer]->home();
00715   else
00716     std::cerr << "Requested illegal viewer for viewHome!!" << std::endl;
00717 }
00718 
00719 void viewAll(int _viewer) {
00720   if ( _viewer == ACTIVE_VIEWER ) {
00721     examiner_widgets_[activeExaminer_]->viewAll();
00722   } else if ( _viewer == ALL_VIEWERS )
00723     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00724       examiner_widgets_[i]->viewAll();
00725   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00726     examiner_widgets_[_viewer]->viewAll();
00727   else
00728     std::cerr << "Requested illegal viewer for viewAll!!" << std::endl;
00729 }
00730 
00731 ACG::Vec3d viewingDirection(int _viewer) {
00732   if ( _viewer == ACTIVE_VIEWER ) {
00733     return viewerProperties(activeExaminer_).glState().viewing_direction();
00734   } else if ( _viewer == ALL_VIEWERS )
00735     std::cerr << "Please select viewer to get viewing direction!" << std::endl;
00736   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00737     return viewerProperties(_viewer).glState().viewing_direction();
00738   else
00739     std::cerr << "Requested illegal viewer for viewingDirection!!" << std::endl;
00740 
00741   return viewerProperties().glState().viewing_direction();
00742 }
00743 
00744 bool isProjectionOrthographic( int _viewer ) {
00745 
00746   if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() ){
00747 
00748     if ( examiner_widgets_[_viewer]->projectionMode() == 0) //ORTHOGRAPHIC_PROJECTION
00749       return true;
00750     else
00751       return false;
00752 
00753   } else
00754     std::cerr << "Requested illegal viewer for isProjectionOrthographic!!" << std::endl;
00755 
00756   return false;
00757 }
00758 
00759 ACG::Vec3d eyePos(int _viewer) {
00760   if ( _viewer == ACTIVE_VIEWER ) {
00761     return viewerProperties(activeExaminer_).glState().eye();
00762   } else if ( _viewer == ALL_VIEWERS )
00763     std::cerr << "Please select viewer to get eyePos!" << std::endl;
00764   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00765     return viewerProperties(_viewer).glState().eye();
00766   else
00767     std::cerr << "Requested illegal viewer for eyePos!!" << std::endl;
00768 
00769   return viewerProperties().glState().eye();
00770 }
00771 
00772 ACG::Vec3d upVector(int _viewer) {
00773   if ( _viewer == ACTIVE_VIEWER ) {
00774     return viewerProperties(activeExaminer_).glState().up();
00775   } else if ( _viewer == ALL_VIEWERS )
00776     std::cerr << "Please select viewer to get up vector!" << std::endl;
00777   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00778     return viewerProperties(_viewer).glState().up();
00779   else
00780     std::cerr << "Requested illegal viewer for up vector!!" << std::endl;
00781 
00782   return viewerProperties().glState().up();
00783 }
00784 
00785 void setViewObjectMarker(ViewObjectMarker * _marker)
00786 {
00787   for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00788     PluginFunctions::viewerProperties(i).objectMarker(_marker);
00789 }
00790 
00791 void setDefaultViewObjectMarker(ViewObjectMarker * _marker)
00792 {
00793   defaultMarker_ = _marker;
00794 }
00795 
00796 ViewObjectMarker * defaultViewObjectMarker()
00797 {
00798   return defaultMarker_;
00799 }
00800 
00801 
00802 ACG::SceneGraph::BaseNode* getSceneGraphRootNode() {
00803    return PluginFunctions::sceneGraphRootNode_;
00804 }
00805 
00806 ACG::SceneGraph::BaseNode* getRootNode() {
00807   return PluginFunctions::dataRootNode_;
00808 }
00809 
00810 void addGlobalNode(ACG::SceneGraph::BaseNode* _node){
00811   if (PluginFunctions::sceneGraphRootNode_)
00812     _node->set_parent( PluginFunctions::sceneGraphRootNode_ );
00813 }
00814 
00815 
00816 void addObjectRenderingNode(ACG::SceneGraph::BaseNode* _node){
00817   if (PluginFunctions::sceneGraphRootNode_){
00818     
00819     // get the current parent Node 
00820     ACG::SceneGraph::BaseNode* parent = dataRootNode_->parent();
00821 
00822     // Move the node to the new parent
00823     _node->set_parent(parent);
00824     
00825     // move dataRootNode_ to the new parent
00826     dataRootNode_->set_parent(_node);
00827   }
00828   
00829 }
00830 
00831 int objectCount() {
00832 
00833   int count = 0;
00834 
00835   // find changed manipulator
00836   for ( PluginFunctions::ObjectIterator o_it(PluginFunctions::ALL_OBJECTS) ;
00837                                         o_it != PluginFunctions::objectsEnd(); ++o_it)  {
00838     ++count;
00839   }
00840 
00841   return ( count );
00842 
00843 }
00844 
00845 int targetCount() {
00846 
00847   int count = 0;
00848 
00849   // find changed manipulator
00850   for ( PluginFunctions::ObjectIterator o_it(PluginFunctions::TARGET_OBJECTS) ;
00851                                         o_it != PluginFunctions::objectsEnd(); ++o_it)  {
00852     ++count;
00853   }
00854 
00855   return ( count );
00856 }
00857 
00858 int sourceCount() {
00859   int count = 0;
00860 
00861   // find changed manipulator
00862   for ( PluginFunctions::ObjectIterator o_it(PluginFunctions::SOURCE_OBJECTS) ;
00863                                         o_it != PluginFunctions::objectsEnd(); ++o_it)  {
00864     ++count;
00865   }
00866 
00867   return ( count );
00868 }
00869 
00870 int visibleCount() {
00871   int count = 0;
00872 
00873   // find changed manipulator
00874   for ( PluginFunctions::ObjectIterator o_it(PluginFunctions::ALL_OBJECTS) ;
00875                                         o_it != PluginFunctions::objectsEnd(); ++o_it)  {
00876     if ( o_it->visible() )
00877     ++count;
00878   }
00879 
00880   return ( count );
00881 
00882 }
00883 
00884 
00889 void get_all_objects( std::vector < BaseObjectData*>& _objects ) {
00890 
00891    _objects.clear();
00892 
00893   // find changed manipulator
00894   for ( PluginFunctions::ObjectIterator o_it(PluginFunctions::ALL_OBJECTS,DATA_TRIANGLE_MESH) ;
00895                                         o_it != PluginFunctions::objectsEnd(); ++o_it)  {
00896     _objects.push_back( *o_it );
00897   }
00898 
00899 }
00900 
00902 void   flyTo (const ACG::Vec3d &_position, const ACG::Vec3d &_center, double _time) {
00903    examiner_widgets_[activeExaminer_]->flyTo(_position,_center,_time);
00904 }
00905 
00906 
00907 // ===============================================================================
00908 // Getting data from objects and casting between them
00909 // ===============================================================================
00910 
00911 BaseObjectData* baseObjectData( BaseObject* _object ){
00912   if ( _object == 0 )
00913     return 0;
00914 
00915   return dynamic_cast< BaseObjectData* >(_object);
00916 }
00917 
00918 // ===============================================================================
00919 // Get the root of the object structure
00920 // ===============================================================================
00921 BaseObject*& objectRoot() {
00922   return (objectRoot_);
00923 }
00924 
00925 }

acg pic Project OpenFlipper, ©  Computer Graphics Group, RWTH Aachen. Documentation generated using doxygen .