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: 8549 $                                                         *
00038  *   $Author: moebius $                                                      *
00039  *   $Date: 2010-02-12 14:40:38 +0100 (Fr, 12. Feb 2010) $                   *
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_ = 0;
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 
00124 static int objectCounter_ = 0;
00125 
00127 static int targetCounter_ = 0;
00128 
00130 static std::map<int, BaseObject*> objectMap_;
00131 
00132 void setDataRoot( BaseObject* _root ) {
00133    objectRoot_ = _root;
00134 }
00135 
00136 int viewers( ) {
00137   return examiner_widgets_.size();
00138 }
00139 
00140 int viewerId() {
00141   return viewerId_;
00142 }
00143 
00144 void setViewers( std::vector< glViewer* > _viewerWidgets ) {
00145    PluginFunctions::examiner_widgets_ = _viewerWidgets;
00146    PluginFunctions::examiner_widget_ =  examiner_widgets_[0];
00147 
00148    // Generate a (hopefully) unique viewer id
00149    QTime time = QTime::currentTime();
00150    qsrand( time.hour() * 10 + time.minute() * 100 + time.second() * 1000 + time.msec() * 10000  );
00151    viewerId_ = qrand();
00152 }
00153 
00154 void setViewerProperties( std::vector< Viewer::ViewerProperties* > _viewerProperties ) {
00155    PluginFunctions::viewerProperties_ = _viewerProperties;
00156 }
00157 
00158 void setActiveExaminer( const unsigned int _id ) {
00159   activeExaminer_ = _id;
00160 }
00161 
00162 glViewer* viewer(int  _viewerId ) {
00163    if ( _viewerId < 0 || _viewerId >= (int)examiner_widgets_.size() ) {
00164      std::cerr << "Requested unknown viewer with id : " << _viewerId << std::endl;
00165      return examiner_widgets_[activeExaminer()];
00166    }
00167 
00168    return( examiner_widgets_[_viewerId] );
00169 }
00170 
00171 unsigned int activeExaminer( ) {
00172   return activeExaminer_;
00173 }
00174 
00175 QString getEncodedExaminerView() {
00176   return getEncodedExaminerView(activeExaminer());
00177 }
00178 
00180 QString getEncodedExaminerView(int _viewerId) {
00181 
00182   QString view;
00183 
00184   if ( _viewerId < 0 || _viewerId >= (int)examiner_widgets_.size() ) {
00185      std::cerr << "Requested unknown viewer with id : " << _viewerId << std::endl;
00186      examiner_widgets_[activeExaminer()]->encodeView ( view );
00187      return view;
00188   }
00189 
00190   examiner_widgets_[_viewerId]->encodeView ( view );
00191   return view;
00192 
00193 }
00194 
00195 void setEncodedExaminerView( QString _view ) {
00196   setEncodedExaminerView( activeExaminer() , _view );
00197 }
00198 
00199 void setEncodedExaminerView(int _viewerId , QString _view ) {
00200 
00201   if ( _viewerId < 0 || _viewerId >= (int)examiner_widgets_.size() ) {
00202      std::cerr << "Requested unknown viewer with id : " << _viewerId << std::endl;
00203      examiner_widgets_[activeExaminer()]->decodeView ( _view );
00204   }
00205 
00206   examiner_widgets_[_viewerId]->decodeView ( _view );
00207 }
00208 
00209 void setDataSeparatorNodes( SeparatorNode* _dataSeparatorNode ) {
00210   
00211   // The function should only be called once by the core. 
00212 
00213   // Set the separatorNode
00214   PluginFunctions::dataSeparatorNode_ = _dataSeparatorNode;
00215 
00216   
00217   if ( PluginFunctions::dataSeparatorNode_->nChildren() != 1 ){
00218     std::cerr << "Only one child allowed for dataSeparatorNode on initialization!" << std::endl;
00219     std::cerr << "The Core has initialized the scenegraph in a strange way!" << std::endl;
00220     ACG::SceneGraph::BaseNode* child = *(PluginFunctions::dataSeparatorNode_->childrenBegin());
00221   }
00222   
00223   // Set the root node for the data objects
00224   // which has to be a child of the dataSeparatorNode_
00225   PluginFunctions::dataRootNode_ = dynamic_cast<ACG::SceneGraph::SeparatorNode*> (*(PluginFunctions::dataSeparatorNode_->childrenBegin()) );
00226   
00227 }
00228 
00229 void setSceneGraphRootNode( SeparatorNode* _root_node ) {
00230    PluginFunctions::sceneGraphRootNode_ = _root_node;
00231 }
00232 
00233 bool getPickedObject(const unsigned int _node_idx , BaseObjectData*& _object) {
00234   for ( ObjectIterator o_it(PluginFunctions::ALL_OBJECTS) ; o_it != PluginFunctions::objectsEnd(); ++o_it) {
00235     if ( o_it->picked( _node_idx ) ) {
00236       _object = *o_it;
00237       return true;
00238     }
00239   }
00240   return false;
00241 }
00242 
00243 
00244 bool getSourceIdentifiers( std::vector<int>& _identifiers  ) {
00245   _identifiers.clear();
00246 
00247   for ( ObjectIterator o_it(PluginFunctions::ALL_OBJECTS) ; o_it != PluginFunctions::objectsEnd(); ++o_it) {
00248     if ( o_it->source() )
00249       _identifiers.push_back ( o_it->id() );
00250   }
00251   return (_identifiers.size() >0 );
00252 }
00253 
00254 bool getTargetIdentifiers( std::vector<int>& _identifiers  ) {
00255   _identifiers.clear();
00256 
00257   for ( ObjectIterator o_it(PluginFunctions::ALL_OBJECTS) ; o_it != PluginFunctions::objectsEnd(); ++o_it) {
00258     if ( o_it->target() )
00259       _identifiers.push_back ( o_it->id() );
00260   }
00261   return (_identifiers.size() >0 );
00262 }
00263 
00264 // ===============================================================================
00265 // Get objects
00266 // ===============================================================================
00267 
00268 bool getObject(  const int _identifier , BaseObject*& _object ) {
00269 
00270   if ( _identifier == -1 )
00271     return false;
00272 
00273   // Obsolete:
00274   //_object = objectRoot_->childExists( _identifier );
00275   
00276   // Search for specified object in object map:
00277   std::map<int, BaseObject*>::iterator it;
00278   it = objectMap_.find(_identifier);
00279   // Get object
00280   _object = (it != objectMap_.end() ? it->second : 0);
00281   
00282   return ( _object != 0 );
00283 }
00284 
00285 bool getObject(  const int _identifier , BaseObjectData*& _object ) {
00286 
00287   if ( _identifier == -1 )
00288     return false;
00289 
00290   // Obsolete: BaseObject* object = objectRoot_->childExists( _identifier );
00291   
00292   // Search for specified object in object map:
00293   std::map<int, BaseObject*>::iterator it;
00294   it = objectMap_.find(_identifier);
00295   // Get object
00296   BaseObject* object = (it != objectMap_.end() ? it->second : 0);
00297   
00298   _object = dynamic_cast< BaseObjectData* >(object);
00299   return ( _object != 0 );
00300 }
00301 
00302 int getObjectId( const QString _name ) {
00303 
00304         if(_name.isEmpty()) return -1;
00305 
00306         BaseObject* object = objectRoot_->childExists( _name );
00307         return object->id();
00308 }
00309 
00310 // ===============================================================================
00311 // ===============================================================================
00312 
00313 bool object_exists(  const int _identifier ) {
00314 
00315   if ( _identifier == -1 )
00316     return false;
00317 
00318   BaseObject* object = objectRoot_->childExists( _identifier );
00319   return ( object != 0 );
00320 }
00321 
00322 //===============================================================================
00323 
00324 bool getAllMeshes( std::vector<int>& _identifiers  ) {
00325 
00326   _identifiers.clear();
00327 
00328   // find changed manipulator
00329   for ( PluginFunctions::ObjectIterator o_it(PluginFunctions::ALL_OBJECTS,typeId("TriangleMesh")) ;
00330                                         o_it != PluginFunctions::objectsEnd(); ++o_it)  {
00331     _identifiers.push_back( o_it->id() );
00332   }
00333 
00334   return (_identifiers.size() > 0);
00335 }
00336 
00337 bool get_all_object_identifiers( std::vector<int>& _identifiers  ) {
00338 
00339   _identifiers.clear();
00340 
00341   // find changed manipulator
00342   for ( PluginFunctions::ObjectIterator o_it(PluginFunctions::ALL_OBJECTS) ;
00343                                         o_it != PluginFunctions::objectsEnd(); ++o_it)  {
00344     _identifiers.push_back( o_it->id() );
00345   }
00346 
00347   return (_identifiers.size() > 0);
00348 }
00349 
00350 void setBackColor( OpenMesh::Vec4f _color) {
00351   for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00352     PluginFunctions::viewerProperties(i).backgroundColor(_color);
00353 }
00354 
00355 void setFixedView(int _mode, int _viewer ) {
00356 
00357   if ( (_viewer != ACTIVE_VIEWER ) && ( ( _viewer < 0 ) || _viewer >= (int)examiner_widgets_.size()) ){
00358     std::cerr << "Unable to set fixed view. Wrong viewer id (" << _viewer << ")" << std::endl;
00359     return;
00360   }
00361 
00362   switch ( _mode ){
00363     case VIEW_TOP : //TOP
00364       PluginFunctions::viewingDirection( ACG::Vec3d(0.0, -1.0, 0.0), ACG::Vec3d(0.0, 0.0, -1.0), _viewer );
00365       PluginFunctions::allowRotation(false, _viewer);
00366       break;
00367     case VIEW_BOTTOM : //BOTTOM
00368       PluginFunctions::viewingDirection( ACG::Vec3d(0.0, 1.0, 0.0), ACG::Vec3d(0.0, 0.0, -1.0), _viewer );
00369       PluginFunctions::allowRotation(false, _viewer);
00370       break;
00371     case VIEW_LEFT : //LEFT
00372       PluginFunctions::viewingDirection( ACG::Vec3d(1.0, 0.0, 0.0), ACG::Vec3d(0.0, 1.0, 0.0), _viewer );
00373       PluginFunctions::allowRotation(false, _viewer);
00374       break;
00375     case VIEW_RIGHT : //RIGHT
00376       PluginFunctions::viewingDirection( ACG::Vec3d(-1.0, 0.0, 0.0), ACG::Vec3d(0.0, 1.0, 0.0), _viewer );
00377       PluginFunctions::allowRotation(false, _viewer);
00378       break;
00379     case VIEW_FRONT : //FRONT
00380       PluginFunctions::viewingDirection( ACG::Vec3d(0.0, 0.0, -1.0), ACG::Vec3d(0.0, 1.0, 0.0), _viewer );
00381       PluginFunctions::allowRotation(false, _viewer);
00382       break;
00383     case VIEW_BACK : //BACK
00384       PluginFunctions::viewingDirection( ACG::Vec3d(0.0, 0.0, 1.0), ACG::Vec3d(0.0, 1.0, 0.0), _viewer );
00385       PluginFunctions::allowRotation(false, _viewer);
00386       break;
00387     default : //Free View
00388       PluginFunctions::allowRotation(true, _viewer);
00389       break;
00390   }
00391 
00392   if ( _viewer == ACTIVE_VIEWER )
00393     viewerProperties(activeExaminer()).currentViewingDirection( _mode );
00394   else
00395     viewerProperties( _viewer ).currentViewingDirection( _mode );
00396 }
00397 
00398 QPoint mapToGlobal(const QPoint _point ) {
00399   return examiner_widgets_[activeExaminer_]->glMapToGlobal(_point);
00400 }
00401 
00402 QPoint mapToLocal( const QPoint _point ) {
00403   return examiner_widgets_[activeExaminer_]->glMapFromGlobal(_point);
00404 }
00405 
00406 void setDrawMode( const ACG::SceneGraph::DrawModes::DrawMode _mode , int _viewer) {
00407 
00408   if ( _viewer == ACTIVE_VIEWER )
00409     viewerProperties(activeExaminer()).drawMode(_mode);
00410   else if ( _viewer == ALL_VIEWERS )
00411     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00412       viewerProperties(i).drawMode(_mode);
00413   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00414     viewerProperties(_viewer).drawMode(_mode);
00415   else
00416     std::cerr << "Requested illegal viewer for setting DrawMode!!" << std::endl;
00417 
00418 }
00419 
00425 ACG::SceneGraph::DrawModes::DrawMode drawMode( int _viewer ) {
00426   if ( _viewer == ACTIVE_VIEWER ) {
00427     return viewerProperties(activeExaminer()).drawMode();
00428   } else if ( _viewer == ALL_VIEWERS )
00429     std::cerr << "Please select viewer to get viewing direction!" << std::endl;
00430   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00431     return viewerProperties(_viewer).drawMode();
00432   else
00433     std::cerr << "Requested illegal viewer for viewingDirection!!" << std::endl;
00434 
00435   return viewerProperties(activeExaminer()).drawMode();
00436 }
00437 
00438 bool scenegraphPick( ACG::SceneGraph::PickTarget _pickTarget, const QPoint &_mousePos, unsigned int &_nodeIdx, unsigned int &_targetIdx, ACG::Vec3d *_hitPointPtr=0 ) {
00439 
00440    return examiner_widgets_[activeExaminer_]->pick( _pickTarget,_mousePos,_nodeIdx,_targetIdx,_hitPointPtr );
00441 }
00442 
00443 bool scenegraphPick( const unsigned int _examiner, ACG::SceneGraph::PickTarget _pickTarget, const QPoint &_mousePos, unsigned int &_nodeIdx, unsigned int &_targetIdx, ACG::Vec3d *_hitPointPtr=0 ) {
00444 
00445   if ( _examiner >= examiner_widgets_.size() ) {
00446     std::cerr << "Wrong examiner id" << std::endl;
00447     return false;
00448   }
00449   return examiner_widgets_[_examiner]->pick( _pickTarget,_mousePos,_nodeIdx,_targetIdx,_hitPointPtr );
00450 }
00451 
00452 bool scenegraphRegionPick( ACG::SceneGraph::PickTarget                _pickTarget,
00453                            const QRegion&                             _region,
00454                            QList<QPair<unsigned int, unsigned int> >& _list)
00455 {
00456   return examiner_widgets_[activeExaminer_]->pick_region( _pickTarget, _region, _list);
00457 }
00458 
00459 bool scenegraphRegionPick( const unsigned int                         _examiner,
00460                            ACG::SceneGraph::PickTarget                _pickTarget,
00461                            const QRegion&                             _region,
00462                            QList<QPair<unsigned int, unsigned int> >& _list)
00463 {
00464   if ( _examiner >= examiner_widgets_.size() ) {
00465     std::cerr << "Wrong examiner id" << std::endl;
00466     return false;
00467   }
00468   return examiner_widgets_[_examiner]->pick_region( _pickTarget, _region, _list);
00469 }
00470 
00471 
00472 
00473 //Warning : Dont use template function as external static pointer for examiner widget is not resolved correctly!!
00474 void traverse( ACG::SceneGraph::MouseEventAction  &_action ) {
00475   // Single pass action, as the mouse action will only update the graph.
00476   // If its changed, it will be set to dirty and an automatic redraw is triggered.
00477   ACG::SceneGraph::traverse(sceneGraphRootNode_, _action,viewerProperties().glState() );
00478 }
00479 
00480 //Warning : Dont use template function as external static pointer for examiner widget is not resolved correctly!!
00481 void traverse( const unsigned int _examiner, ACG::SceneGraph::MouseEventAction  &_action ) {
00482 
00483   if ( _examiner >= examiner_widgets_.size() ) {
00484     std::cerr << "Wrong examiner id" << std::endl;
00485     return;
00486   }
00487 
00488   // Single pass action, as the mouse action will only update the graph.
00489   // If its changed, it will be set to dirty and an automatic redraw is triggered.
00490   ACG::SceneGraph::traverse(sceneGraphRootNode_, _action,viewerProperties(_examiner).glState() );
00491 }
00492 
00493 
00494 const std::string pickMode () {
00495   // No seperate draw modes available all should have the same so take first
00496   return viewerProperties().pickMode();
00497 }
00498 
00499 void pickMode ( std::string _mode) {
00500   // switch to default marker
00501   setViewObjectMarker (defaultViewObjectMarker ());
00502   viewerProperties().pickMode(_mode);
00503 }
00504 
00505 Viewer::ActionMode actionMode() {
00506    return viewerProperties().actionMode();
00507 }
00508 
00509 void actionMode ( Viewer::ActionMode _mode) {
00510 
00511   viewerProperties().actionMode(_mode);
00512 }
00513 
00514 void shareGLWidget (QGLWidget *_widget)
00515 {
00516   shareGLWidget_ = _widget;
00517 }
00518 
00519 QGLWidget *shareGLWidget ()
00520 {
00521   return shareGLWidget_;
00522 }
00523 
00524 void getCurrentViewImage(QImage& _image) {
00525   viewer( activeExaminer() )->snapshot( _image, true );
00526 }
00527 
00528 Viewer::ViewerProperties& viewerProperties(int _id) {
00529   if ( _id >= (int)viewerProperties_.size() ) {
00530     std::cerr << " Error, requested properties for non-existing Viewer!" << std::endl;
00531     return dummyProperties;
00532   }
00533 
00534   if ( _id == -1 )
00535     _id = activeExaminer_;
00536 
00537   return ( *viewerProperties_[_id] );
00538 
00539 }
00540 
00541 void perspectiveProjection( int _viewer ) {
00542   if ( _viewer == ACTIVE_VIEWER ) {
00543     examiner_widgets_[activeExaminer_]->perspectiveProjection();
00544   } else if ( _viewer == ALL_VIEWERS )
00545     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00546       examiner_widgets_[i]->perspectiveProjection();
00547   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00548     examiner_widgets_[_viewer]->perspectiveProjection();
00549   else
00550     std::cerr << "Requested illegal viewer for perspectiveProjection()!!" << std::endl;
00551 }
00552 
00553 void orthographicProjection( int _viewer ) {
00554   if ( _viewer == ACTIVE_VIEWER ) {
00555     examiner_widgets_[activeExaminer_]->orthographicProjection();
00556   } else if ( _viewer == ALL_VIEWERS )
00557     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00558       examiner_widgets_[i]->orthographicProjection();
00559   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00560     examiner_widgets_[_viewer]->orthographicProjection();
00561   else
00562     std::cerr << "Requested illegal viewer for orthographicProjection()!!" << std::endl;
00563 }
00564 
00565 void allowRotation(bool _mode, int _viewer ) {
00566   if ( _viewer == ACTIVE_VIEWER ) {
00567     examiner_widgets_[activeExaminer_]->allowRotation(_mode);
00568   } else if ( _viewer == ALL_VIEWERS )
00569     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00570       examiner_widgets_[i]->allowRotation(_mode);
00571   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00572     examiner_widgets_[_viewer]->allowRotation(_mode);
00573   else
00574     std::cerr << "Requested illegal viewer for allowRotation!!" << std::endl;
00575 }
00576 
00577 bool allowRotation( int _viewer ) {
00578 
00579   if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00580     return examiner_widgets_[_viewer]->allowRotation();
00581   else {
00582 
00583     std::cerr << "Requested illegal viewer for isRotationAllowed!!" << std::endl;
00584     return false;
00585   }
00586 }
00587 
00588 void setMainGLContext() {
00589   examiner_widget_->makeCurrent();
00590 }
00591 
00592 void viewingDirection(const ACG::Vec3d &_dir, const ACG::Vec3d &_up , int _viewer ) {
00593   if ( _viewer == ACTIVE_VIEWER ) {
00594     examiner_widgets_[activeExaminer_]->viewingDirection(_dir,_up);
00595   } else if ( _viewer == ALL_VIEWERS )
00596     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00597       examiner_widgets_[i]->viewingDirection(_dir,_up);
00598   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00599     examiner_widgets_[_viewer]->viewingDirection(_dir,_up);
00600   else
00601     std::cerr << "Requested illegal viewer for viewingDirection!!" << std::endl;
00602 }
00603 
00604 const ACG::Vec3d trackBallCenter(const ACG::Vec3d& _center, int _viewer ) {
00605   if ( _viewer == ACTIVE_VIEWER ) {
00606     return examiner_widgets_[activeExaminer_]->trackBallCenter();
00607   } else if ( _viewer == ALL_VIEWERS )
00608     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00609       return examiner_widgets_[i]->trackBallCenter(  );
00610     else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00611       return examiner_widgets_[_viewer]->trackBallCenter(  );
00612     else
00613       std::cerr << "Requested illegal viewer for setTrackBallCenter!!" << std::endl;
00614 
00615   return examiner_widgets_[activeExaminer_]->trackBallCenter();
00616 }
00617 
00618 void setTrackBallCenter(const ACG::Vec3d& _center, int _viewer ) {
00619   if ( _viewer == ACTIVE_VIEWER ) {
00620     examiner_widgets_[activeExaminer_]->setTrackBallCenter( _center );
00621   } else if ( _viewer == ALL_VIEWERS )
00622     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00623       examiner_widgets_[i]->setTrackBallCenter( _center );
00624     else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00625       examiner_widgets_[_viewer]->setTrackBallCenter( _center );
00626     else
00627       std::cerr << "Requested illegal viewer for setTrackBallCenter!!" << std::endl;
00628 }
00629 
00630 void setScenePos(const ACG::Vec3d& _center,const double _radius, int _viewer ) {
00631   if ( _viewer == ACTIVE_VIEWER ) {
00632     examiner_widgets_[activeExaminer_]->setScenePos( _center, _radius );
00633   } else if ( _viewer == ALL_VIEWERS )
00634     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00635       examiner_widgets_[i]->setScenePos( _center, _radius );
00636   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00637     examiner_widgets_[_viewer]->setScenePos( _center, _radius );
00638   else
00639     std::cerr << "Requested illegal viewer for setScenePos!!" << std::endl;
00640 }
00641 
00642 void setScenePos(const ACG::Vec3d& _center, int _viewer ) {
00643   if ( _viewer == ACTIVE_VIEWER ) {
00644     examiner_widgets_[activeExaminer_]->setScenePos( _center, examiner_widgets_[activeExaminer_]->scene_radius() );
00645   } else if ( _viewer == ALL_VIEWERS )
00646     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00647       examiner_widgets_[i]->setScenePos( _center, examiner_widgets_[i]->scene_radius() );
00648   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00649     examiner_widgets_[_viewer]->setScenePos( _center, examiner_widgets_[_viewer]->scene_radius() );
00650   else
00651     std::cerr << "Requested illegal viewer for setScenePos!!" << std::endl;
00652 }
00653 
00654 void setSceneCenter(const ACG::Vec3d& _center, int _viewer) {
00655 
00656         if (_viewer == ACTIVE_VIEWER) {
00657 
00658                 examiner_widgets_[activeExaminer_]->setSceneCenter(_center);
00659         } else if (_viewer == ALL_VIEWERS) {
00660 
00661                 for (uint i = 0; i < examiner_widgets_.size(); ++i) {
00662 
00663                         examiner_widgets_[i]->setSceneCenter(_center);
00664                 }
00665         } else if ((_viewer >= 0) && _viewer < (int) examiner_widgets_.size()) {
00666 
00667                 examiner_widgets_[_viewer]->setSceneCenter(_center);
00668         } else {
00669                 std::cerr << "Requested illegal viewer for setSceneCenter!!"
00670                                 << std::endl;
00671         }
00672 }
00673 
00674 const ACG::Vec3d& sceneCenter(int _viewer) {
00675 
00676         if (_viewer == ACTIVE_VIEWER) {
00677                 return examiner_widgets_[activeExaminer_]->scene_center();
00678         } else if (_viewer == ALL_VIEWERS)
00679                 std::cerr << "Please select viewer to get viewing direction!"
00680                                 << std::endl;
00681         else if ((_viewer >= 0) && _viewer < (int) examiner_widgets_.size())
00682                 return examiner_widgets_[_viewer]->scene_center();
00683         else
00684                 std::cerr << "Requested illegal viewer for sceneCenter!!" << std::endl;
00685 
00686         return examiner_widgets_[activeExaminer_]->scene_center();
00687 }
00688 
00689 double sceneRadius() {
00690    return examiner_widgets_[activeExaminer_]->scene_radius();
00691 }
00692 
00693 double sceneRadius( int _viewer ) {
00694   if ( _viewer == ACTIVE_VIEWER ) {
00695     return examiner_widgets_[activeExaminer_]->scene_radius();
00696   } else if ( _viewer == ALL_VIEWERS )
00697     std::cerr << "Illegal request for scene radius. Please select one viewer!" << std::endl;
00698   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00699     return examiner_widgets_[_viewer]->scene_radius();
00700   else
00701     std::cerr << "Requested illegal viewer for translate!!" << std::endl;
00702 
00703   return -1;
00704 }
00705 
00706 void translate( const ACG::Vec3d &_vector , int _viewer ) {
00707   if ( _viewer == ACTIVE_VIEWER ) {
00708     examiner_widgets_[activeExaminer_]->translate(_vector);
00709   } else if ( _viewer == ALL_VIEWERS )
00710     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00711       examiner_widgets_[i]->translate(_vector);
00712   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00713     examiner_widgets_[_viewer]->translate(_vector);
00714   else
00715     std::cerr << "Requested illegal viewer for translate!!" << std::endl;
00716 }
00717 
00718 void rotate(const ACG::Vec3d&  _axis,
00719             const double       _angle,
00720             const ACG::Vec3d&  _center,
00721             int                _viewer )
00722 {
00723   if ( _viewer == ACTIVE_VIEWER ) {
00724     examiner_widgets_[activeExaminer_]->rotate(_axis,_angle,_center);
00725   } else if ( _viewer == ALL_VIEWERS )
00726     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00727       examiner_widgets_[i]->rotate(_axis,_angle,_center);
00728   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00729     examiner_widgets_[_viewer]->rotate(_axis,_angle,_center);
00730   else
00731     std::cerr << "Requested illegal viewer for rotate!!" << std::endl;
00732 }
00733 
00734 void viewHome(int _viewer) {
00735   if ( _viewer == ACTIVE_VIEWER ) {
00736     examiner_widgets_[activeExaminer_]->home();
00737   } else if ( _viewer == ALL_VIEWERS )
00738     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00739       examiner_widgets_[i]->home();
00740   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00741     examiner_widgets_[_viewer]->home();
00742   else
00743     std::cerr << "Requested illegal viewer for viewHome!!" << std::endl;
00744 }
00745 
00746 void viewAll(int _viewer) {
00747   if ( _viewer == ACTIVE_VIEWER ) {
00748     examiner_widgets_[activeExaminer_]->viewAll();
00749   } else if ( _viewer == ALL_VIEWERS )
00750     for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00751       examiner_widgets_[i]->viewAll();
00752   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00753     examiner_widgets_[_viewer]->viewAll();
00754   else
00755     std::cerr << "Requested illegal viewer for viewAll!!" << std::endl;
00756 }
00757 
00758 ACG::Vec3d viewingDirection(int _viewer) {
00759   if ( _viewer == ACTIVE_VIEWER ) {
00760     return viewerProperties(activeExaminer_).glState().viewing_direction();
00761   } else if ( _viewer == ALL_VIEWERS )
00762     std::cerr << "Please select viewer to get viewing direction!" << std::endl;
00763   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00764     return viewerProperties(_viewer).glState().viewing_direction();
00765   else
00766     std::cerr << "Requested illegal viewer for viewingDirection!!" << std::endl;
00767 
00768   return viewerProperties().glState().viewing_direction();
00769 }
00770 
00771 bool isProjectionOrthographic( int _viewer ) {
00772 
00773   if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() ){
00774 
00775     if ( examiner_widgets_[_viewer]->projectionMode() == 0) //ORTHOGRAPHIC_PROJECTION
00776       return true;
00777     else
00778       return false;
00779 
00780   } else
00781     std::cerr << "Requested illegal viewer for isProjectionOrthographic!!" << std::endl;
00782 
00783   return false;
00784 }
00785 
00786 ACG::Vec3d eyePos(int _viewer) {
00787   if ( _viewer == ACTIVE_VIEWER ) {
00788     return viewerProperties(activeExaminer_).glState().eye();
00789   } else if ( _viewer == ALL_VIEWERS )
00790     std::cerr << "Please select viewer to get eyePos!" << std::endl;
00791   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00792     return viewerProperties(_viewer).glState().eye();
00793   else
00794     std::cerr << "Requested illegal viewer for eyePos!!" << std::endl;
00795 
00796   return viewerProperties().glState().eye();
00797 }
00798 
00799 ACG::Vec3d upVector(int _viewer) {
00800   if ( _viewer == ACTIVE_VIEWER ) {
00801     return viewerProperties(activeExaminer_).glState().up();
00802   } else if ( _viewer == ALL_VIEWERS )
00803     std::cerr << "Please select viewer to get up vector!" << std::endl;
00804   else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
00805     return viewerProperties(_viewer).glState().up();
00806   else
00807     std::cerr << "Requested illegal viewer for up vector!!" << std::endl;
00808 
00809   return viewerProperties().glState().up();
00810 }
00811 
00812 void setViewObjectMarker(ViewObjectMarker * _marker)
00813 {
00814   for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
00815     PluginFunctions::viewerProperties(i).objectMarker(_marker);
00816 }
00817 
00818 void setDefaultViewObjectMarker(ViewObjectMarker * _marker)
00819 {
00820   defaultMarker_ = _marker;
00821 }
00822 
00823 ViewObjectMarker * defaultViewObjectMarker()
00824 {
00825   return defaultMarker_;
00826 }
00827 
00828 
00829 ACG::SceneGraph::BaseNode* getSceneGraphRootNode() {
00830    return PluginFunctions::sceneGraphRootNode_;
00831 }
00832 
00833 ACG::SceneGraph::BaseNode* getRootNode() {
00834   return PluginFunctions::dataRootNode_;
00835 }
00836 
00837 void addGlobalNode(ACG::SceneGraph::BaseNode* _node){
00838   if (PluginFunctions::sceneGraphRootNode_)
00839     _node->set_parent( PluginFunctions::sceneGraphRootNode_ );
00840 }
00841 
00842 
00843 void addObjectRenderingNode(ACG::SceneGraph::BaseNode* _node){
00844   if (PluginFunctions::sceneGraphRootNode_){
00845     
00846     // get the current parent Node 
00847     ACG::SceneGraph::BaseNode* parent = dataRootNode_->parent();
00848 
00849     // Move the node to the new parent
00850     _node->set_parent(parent);
00851     
00852     // move dataRootNode_ to the new parent
00853     dataRootNode_->set_parent(_node);
00854   }
00855   
00856 }
00857 
00858 int objectCount() {
00859   return(objectCounter_);
00860 }
00861 
00862 
00863 
00864 int targetCount() {
00865   return ( targetCounter_ );
00866 }
00867 
00868 int sourceCount() {
00869   int count = 0;
00870 
00871   // find changed manipulator
00872   for ( PluginFunctions::ObjectIterator o_it(PluginFunctions::SOURCE_OBJECTS) ;
00873                                         o_it != PluginFunctions::objectsEnd(); ++o_it)  {
00874     ++count;
00875   }
00876 
00877   return ( count );
00878 }
00879 
00880 int visibleCount() {
00881   int count = 0;
00882 
00883   // find changed manipulator
00884   for ( PluginFunctions::ObjectIterator o_it(PluginFunctions::ALL_OBJECTS) ;
00885                                         o_it != PluginFunctions::objectsEnd(); ++o_it)  {
00886     if ( o_it->visible() )
00887     ++count;
00888   }
00889 
00890   return ( count );
00891 
00892 }
00893 
00894 
00899 void get_all_objects( std::vector < BaseObjectData*>& _objects ) {
00900 
00901    _objects.clear();
00902 
00903   // find changed manipulator
00904   for ( PluginFunctions::ObjectIterator o_it(PluginFunctions::ALL_OBJECTS,DATA_ALL) ;
00905                                         o_it != PluginFunctions::objectsEnd(); ++o_it)  {
00906     _objects.push_back( *o_it );
00907   }
00908 
00909 }
00910 
00912 void   flyTo (const ACG::Vec3d &_position, const ACG::Vec3d &_center, double _time) {
00913    examiner_widgets_[activeExaminer_]->flyTo(_position,_center,_time);
00914 }
00915 
00916 
00917 // ===============================================================================
00918 // Getting data from objects and casting between them
00919 // ===============================================================================
00920 
00921 BaseObjectData* baseObjectData( BaseObject* _object ){
00922   if ( _object == 0 )
00923     return 0;
00924 
00925   return dynamic_cast< BaseObjectData* >(_object);
00926 }
00927 
00928 // ===============================================================================
00929 // Get the root of the object structure
00930 // ===============================================================================
00931 BaseObject*& objectRoot() {
00932   return (objectRoot_);
00933 }
00934 
00935 void increaseObjectCount() {
00936   objectCounter_++;
00937 }
00938 
00939 // Increase the number of current Object
00940 void decreaseObjectCount() {
00941   objectCounter_--;
00942   
00943   if ( objectCounter_ < 0 )
00944     std::cerr << "Deleted more objects than created!!!" << std::endl;
00945 }
00946 
00947 void increaseTargetCount() {
00948   targetCounter_++;
00949 }
00950 
00951 // Increase the number of current Object
00952 void decreaseTargetCount() {
00953   targetCounter_--;
00954   
00955   if ( targetCounter_ < 0 )
00956     std::cerr << "target object counter underflow!!!" << std::endl;
00957 }
00958 
00959 // ===============================================================================
00960 // Add an object to the internal object map
00961 // ===============================================================================
00962 void addObjectToMap(int _objectId, BaseObject* _object) {
00963     
00964     // Look if object's id already exists in map
00965     std::map<int, BaseObject*>::iterator it;
00966     it = objectMap_.find(_objectId);
00967     // If so return
00968     if(it != objectMap_.end()) return;
00969     
00970     // Add new object to map
00971     objectMap_.insert(std::pair<int, BaseObject*>(_objectId, _object));
00972 }
00973 
00974 // ===============================================================================
00975 // Remove an object from the internal object map
00976 // ===============================================================================
00977 void removeObjectFromMap(int _objectId) {
00978     
00979     // Look if object exists in map
00980     std::map<int, BaseObject*>::iterator it;
00981     it = objectMap_.find(_objectId);
00982     
00983     // Erase entry
00984     if(it != objectMap_.end()) objectMap_.erase(it);
00985 }
00986 
00987 
00988 } // End namespace PluginFunctions

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