Developer Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
PluginFunctions.cc
1 /*===========================================================================*\
2 * *
3 * OpenFlipper *
4 * Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen *
5 * www.openflipper.org *
6 * *
7 *--------------------------------------------------------------------------- *
8 * This file is part of OpenFlipper. *
9 * *
10 * OpenFlipper is free software: you can redistribute it and/or modify *
11 * it under the terms of the GNU Lesser General Public License as *
12 * published by the Free Software Foundation, either version 3 of *
13 * the License, or (at your option) any later version with the *
14 * following exceptions: *
15 * *
16 * If other files instantiate templates or use macros *
17 * or inline functions from this file, or you compile this file and *
18 * link it with other files to produce an executable, this file does *
19 * not by itself cause the resulting executable to be covered by the *
20 * GNU Lesser General Public License. This exception does not however *
21 * invalidate any other reasons why the executable file might be *
22 * covered by the GNU Lesser General Public License. *
23 * *
24 * OpenFlipper is distributed in the hope that it will be useful, *
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
27 * GNU Lesser General Public License for more details. *
28 * *
29 * You should have received a copy of the GNU LesserGeneral Public *
30 * License along with OpenFlipper. If not, *
31 * see <http://www.gnu.org/licenses/>. *
32 * *
33 \*===========================================================================*/
34 
35 /*===========================================================================*\
36 * *
37 * $Revision: 14601 $ *
38 * $LastChangedBy: moebius $ *
39 * $Date: 2012-05-14 09:17:13 +0200 (Mo, 14 Mai 2012) $ *
40 * *
41 \*===========================================================================*/
42 
43 
44 
45 
46 //=============================================================================
47 //
48 // Plugin Functions
49 //
50 //=============================================================================
51 
54 #include <QGLWidget>
55 
56 #include "PluginFunctions.hh"
57 #include "PluginFunctionsCore.hh"
58 
59 namespace PluginFunctions {
60 
65 static BaseObject* objectRoot_ = 0;
66 
71 static std::vector< glViewer* > examiner_widgets_;
72 
77 static std::vector< Viewer::ViewerProperties* > viewerProperties_;
78 
80 static glViewer* examiner_widget_;
81 
83 static unsigned int activeExaminer_ = 0;
84 
85 static bool internalLightHandling_ = true;
86 
93 static SeparatorNode* dataRootNode_ = 0;
94 
98 static SeparatorNode* dataSeparatorNode_ = 0;
99 
102 static SeparatorNode* sceneGraphRootNodeGlobal_ = 0;
103 
106 static SeparatorNode* sceneGraphRootNode_ = 0;
107 
111 static Viewer::ViewerProperties dummyProperties(-1);
112 
113 
118 static ViewObjectMarker* defaultMarker_ = 0;
119 
124 static QGLWidget* shareGLWidget_ = 0;
125 
128 static int viewerId_ = 0;
129 
131 static int objectCounter_ = 0;
132 
134 static int targetCounter_ = 0;
135 
137 static std::map<int, BaseObject*> objectMap_;
138 
140 QMap< std::string ,ACG::QtWidgets::SceneGraphWidgetGenerator* > sceneGraphGenerators_;
141 
142 void setDataRoot( BaseObject* _root ) {
143  objectRoot_ = _root;
144 }
145 
146 int viewers( ) {
147  return examiner_widgets_.size();
148 }
149 
151  internalLightHandling_ = false;
152 }
153 
155  return internalLightHandling_;
156 }
157 
158 int viewerId() {
159  return viewerId_;
160 }
161 
162 void setViewers( std::vector< glViewer* > _viewerWidgets ) {
163  PluginFunctions::examiner_widgets_ = _viewerWidgets;
164  PluginFunctions::examiner_widget_ = examiner_widgets_[0];
165 
166  // Generate a (hopefully) unique viewer id
167  QTime time = QTime::currentTime();
168  qsrand( time.hour() * 10 + time.minute() * 100 + time.second() * 1000 + time.msec() * 10000 );
169  viewerId_ = qrand();
170 }
171 
172 void setViewerProperties( std::vector< Viewer::ViewerProperties* > _viewerProperties ) {
173  PluginFunctions::viewerProperties_ = _viewerProperties;
174 }
175 
176 void setActiveExaminer( const unsigned int _id ) {
177  activeExaminer_ = _id;
178 }
179 
180 glViewer* viewer(int _viewerId ) {
181  if ( _viewerId < 0 || _viewerId >= (int)examiner_widgets_.size() ) {
182  std::cerr << "Requested unknown viewer with id : " << _viewerId << std::endl;
183  return examiner_widgets_[activeExaminer()];
184  }
185 
186  return( examiner_widgets_[_viewerId] );
187 }
188 
189 unsigned int activeExaminer( ) {
190  return activeExaminer_;
191 }
192 
195 }
196 
198 QString getEncodedExaminerView(int _viewerId) {
199 
200  QString view;
201 
202  if ( _viewerId < 0 || _viewerId >= (int)examiner_widgets_.size() ) {
203  std::cerr << "Requested unknown viewer with id : " << _viewerId << std::endl;
204  examiner_widgets_[activeExaminer()]->encodeView ( view );
205  return view;
206  }
207 
208  examiner_widgets_[_viewerId]->encodeView ( view );
209  return view;
210 
211 }
212 
213 void setEncodedExaminerView( QString _view ) {
215 }
216 
217 void setEncodedExaminerView(int _viewerId , QString _view ) {
218 
219  if ( _viewerId < 0 || _viewerId >= (int)examiner_widgets_.size() ) {
220  std::cerr << "Requested unknown viewer with id : " << _viewerId << std::endl;
221  examiner_widgets_[activeExaminer()]->decodeView ( _view );
222  }
223 
224  examiner_widgets_[_viewerId]->decodeView ( _view );
225 }
226 
227 void setDataSeparatorNodes( SeparatorNode* _dataSeparatorNode ) {
228 
229  // The function should only be called once by the core.
230 
231  // Set the separatorNode
232  PluginFunctions::dataSeparatorNode_ = _dataSeparatorNode;
233 
234 
235  if ( PluginFunctions::dataSeparatorNode_->nChildren() != 1 ){
236  std::cerr << "Only one child allowed for dataSeparatorNode on initialization!" << std::endl;
237  std::cerr << "The Core has initialized the scenegraph in a strange way!" << std::endl;
238  }
239 
240  // Set the root node for the data objects
241  // which has to be a child of the dataSeparatorNode_
242  PluginFunctions::dataRootNode_ = dynamic_cast<ACG::SceneGraph::SeparatorNode*> (*(PluginFunctions::dataSeparatorNode_->childrenBegin()) );
243 
244 }
245 
247  PluginFunctions::sceneGraphRootNode_ = _root_node;
248 }
249 
251  PluginFunctions::sceneGraphRootNodeGlobal_ = _root_node;
252 }
253 
254 bool getPickedObject(const unsigned int _node_idx , BaseObjectData*& _object) {
256  if ( o_it->picked( _node_idx ) ) {
257  _object = *o_it;
258  return true;
259  }
260  }
261  return false;
262 }
263 
264 
265 bool getSourceIdentifiers( std::vector<int>& _identifiers ) {
266  _identifiers.clear();
267 
269  if ( o_it->source() )
270  _identifiers.push_back ( o_it->id() );
271  }
272  return ( ! _identifiers.empty() );
273 }
274 
275 bool getTargetIdentifiers( std::vector<int>& _identifiers ) {
276  _identifiers.clear();
277 
279  if ( o_it->target() )
280  _identifiers.push_back ( o_it->id() );
281  }
282  return ( !_identifiers.empty() );
283 }
284 
285 // ===============================================================================
286 // Get objects
287 // ===============================================================================
288 
289 bool getObject( const int _identifier , BaseObject*& _object ) {
290 
291  if ( _identifier == -1 )
292  return false;
293 
294  // Obsolete:
295  //_object = objectRoot_->childExists( _identifier );
296 
297  // Search for specified object in object map:
298  std::map<int, BaseObject*>::iterator it;
299  it = objectMap_.find(_identifier);
300  // Get object
301  _object = (it != objectMap_.end() ? it->second : 0);
302 
303  return ( _object != 0 );
304 }
305 
306 bool getObject( const int _identifier , BaseObjectData*& _object ) {
307 
308  if ( _identifier == -1 )
309  return false;
310 
311  // Obsolete: BaseObject* object = objectRoot_->childExists( _identifier );
312 
313  // Search for specified object in object map:
314  std::map<int, BaseObject*>::iterator it;
315  it = objectMap_.find(_identifier);
316  // Get object
317  BaseObject* object = (it != objectMap_.end() ? it->second : 0);
318 
319  _object = dynamic_cast< BaseObjectData* >(object);
320  return ( _object != 0 );
321 }
322 
323 int getObjectId( const QString& _name ) {
324  if(_name.isEmpty()) return -1;
325 
326  BaseObject* object = objectRoot_->childExists( _name );
327  return object ? object->id() : -1;
328 }
329 
330 // ===============================================================================
331 // ===============================================================================
332 
333 bool object_exists( const int _identifier ) {
334 
335  if ( _identifier == -1 )
336  return false;
337 
338  BaseObject* object = objectRoot_->childExists( _identifier );
339  return ( object != 0 );
340 }
341 
342 //===============================================================================
343 
344 bool getAllMeshes( std::vector<int>& _identifiers ) {
345 
346  _identifiers.clear();
347 
348  // find changed manipulator
350  o_it != PluginFunctions::objectsEnd(); ++o_it) {
351  _identifiers.push_back( o_it->id() );
352  }
353 
354  return (!_identifiers.empty());
355 }
356 
357 bool get_all_object_identifiers( std::vector<int>& _identifiers ) {
358 
359  _identifiers.clear();
360 
361  // find changed manipulator
363  o_it != PluginFunctions::objectsEnd(); ++o_it) {
364  _identifiers.push_back( o_it->id() );
365  }
366 
367  return ( !_identifiers.empty() );
368 }
369 
371  for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
373 }
374 
375 void setFixedView(int _mode, int _viewer ) {
376 
377  if ( (_viewer != ACTIVE_VIEWER ) && ( ( _viewer < 0 ) || _viewer >= (int)examiner_widgets_.size()) ){
378  std::cerr << "Unable to set fixed view. Wrong viewer id (" << _viewer << ")" << std::endl;
379  return;
380  }
381 
382  switch ( _mode ){
383  case VIEW_TOP : //TOP
384  PluginFunctions::viewingDirection( ACG::Vec3d(0.0, -1.0, 0.0), ACG::Vec3d(0.0, 0.0, -1.0), _viewer );
386  break;
387  case VIEW_BOTTOM : //BOTTOM
388  PluginFunctions::viewingDirection( ACG::Vec3d(0.0, 1.0, 0.0), ACG::Vec3d(0.0, 0.0, -1.0), _viewer );
390  break;
391  case VIEW_LEFT : //LEFT
392  PluginFunctions::viewingDirection( ACG::Vec3d(1.0, 0.0, 0.0), ACG::Vec3d(0.0, 1.0, 0.0), _viewer );
394  break;
395  case VIEW_RIGHT : //RIGHT
396  PluginFunctions::viewingDirection( ACG::Vec3d(-1.0, 0.0, 0.0), ACG::Vec3d(0.0, 1.0, 0.0), _viewer );
398  break;
399  case VIEW_FRONT : //FRONT
400  PluginFunctions::viewingDirection( ACG::Vec3d(0.0, 0.0, -1.0), ACG::Vec3d(0.0, 1.0, 0.0), _viewer );
402  break;
403  case VIEW_BACK : //BACK
404  PluginFunctions::viewingDirection( ACG::Vec3d(0.0, 0.0, 1.0), ACG::Vec3d(0.0, 1.0, 0.0), _viewer );
406  break;
407  default : //Free View
408  PluginFunctions::allowRotation(true, _viewer);
409  break;
410  }
411 
412  if ( _viewer == ACTIVE_VIEWER )
414  else
415  viewerProperties( _viewer ).currentViewingDirection( _mode );
416 }
417 
418 QPoint mapToGlobal(const QPoint _point ) {
419  return examiner_widgets_[activeExaminer_]->glMapToGlobal(_point);
420 }
421 
422 QPoint mapToLocal( const QPoint _point ) {
423  return examiner_widgets_[activeExaminer_]->glMapFromGlobal(_point);
424 }
425 
426 void setDrawMode( const ACG::SceneGraph::DrawModes::DrawMode _mode , int _viewer) {
427 
428  if ( _viewer == ACTIVE_VIEWER )
430  else if ( _viewer == ALL_VIEWERS )
431  for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
432  viewerProperties(i).drawMode(_mode);
433  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
434  viewerProperties(_viewer).drawMode(_mode);
435  else
436  std::cerr << "Requested illegal viewer for setting DrawMode!!" << std::endl;
437 
438 }
439 
446  if ( _viewer == ACTIVE_VIEWER ) {
448  } else if ( _viewer == ALL_VIEWERS )
449  std::cerr << "Please select viewer to get viewing direction!" << std::endl;
450  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
451  return viewerProperties(_viewer).drawMode();
452  else
453  std::cerr << "Requested illegal viewer for viewingDirection!!" << std::endl;
454 
456 }
457 
458 bool scenegraphPick( ACG::SceneGraph::PickTarget _pickTarget, const QPoint &_mousePos, unsigned int &_nodeIdx, unsigned int &_targetIdx, ACG::Vec3d *_hitPointPtr=0 ) {
459 
460  return examiner_widgets_[activeExaminer_]->pick( _pickTarget,_mousePos,_nodeIdx,_targetIdx,_hitPointPtr );
461 }
462 
463 bool scenegraphPick( const unsigned int _examiner, ACG::SceneGraph::PickTarget _pickTarget, const QPoint &_mousePos, unsigned int &_nodeIdx, unsigned int &_targetIdx, ACG::Vec3d *_hitPointPtr=0 ) {
464 
465  if ( _examiner >= examiner_widgets_.size() ) {
466  std::cerr << "Wrong examiner id" << std::endl;
467  return false;
468  }
469  return examiner_widgets_[_examiner]->pick( _pickTarget,_mousePos,_nodeIdx,_targetIdx,_hitPointPtr );
470 }
471 
473  const QRegion& _region,
474  QList<QPair<unsigned int, unsigned int> >& _list,
475  QVector<float>* _depths,
476  QVector<ACG::Vec3d>* _points)
477 {
478  return examiner_widgets_[activeExaminer_]->pick_region( _pickTarget, _region, _list, _depths, _points);
479 }
480 
481 bool scenegraphRegionPick( const unsigned int _examiner,
482  ACG::SceneGraph::PickTarget _pickTarget,
483  const QRegion& _region,
484  QList<QPair<unsigned int, unsigned int> >& _list,
485  QVector<float>* _depths,
486  QVector<ACG::Vec3d>* _points)
487 {
488  if ( _examiner >= examiner_widgets_.size() ) {
489  std::cerr << "Wrong examiner id" << std::endl;
490  return false;
491  }
492  return examiner_widgets_[_examiner]->pick_region( _pickTarget, _region, _list, _depths, _points);
493 }
494 
495 //Warning : Dont use template function as external static pointer for examiner widget is not resolved correctly!!
497  // Single pass action, as the mouse action will only update the graph.
498  // If its changed, it will be set to dirty and an automatic redraw is triggered.
499  ACG::SceneGraph::traverse(sceneGraphRootNode_, _action );
500 }
501 
502 const std::string pickMode () {
503  // No seperate draw modes available all should have the same so take first
504  return viewerProperties().pickMode();
505 }
506 
507 void pickMode ( const std::string& _mode) {
508  // switch to default marker
510  viewerProperties().pickMode(_mode);
511 }
512 
513 Viewer::ActionMode actionMode() {
514  return viewerProperties().actionMode();
515 }
516 
517 void actionMode ( Viewer::ActionMode _mode) {
518 
519  viewerProperties().actionMode(_mode);
520 }
521 
522 void shareGLWidget (QGLWidget *_widget)
523 {
524  shareGLWidget_ = _widget;
525 }
526 
527 QGLWidget *shareGLWidget ()
528 {
529  return shareGLWidget_;
530 }
531 
532 void getCurrentViewImage(QImage& _image) {
533  viewer( activeExaminer() )->snapshot( _image );
534 }
535 
537  if ( _id >= (int)viewerProperties_.size() ) {
538  std::cerr << " Error, requested properties for non-existing Viewer!" << std::endl;
539  return dummyProperties;
540  }
541 
542  if ( _id == -1 )
543  _id = activeExaminer_;
544 
545  return ( *viewerProperties_[_id] );
546 
547 }
548 
549 void perspectiveProjection( int _viewer ) {
550  if ( _viewer == ACTIVE_VIEWER ) {
551  examiner_widgets_[activeExaminer_]->perspectiveProjection();
552  } else if ( _viewer == ALL_VIEWERS )
553  for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
554  examiner_widgets_[i]->perspectiveProjection();
555  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
556  examiner_widgets_[_viewer]->perspectiveProjection();
557  else
558  std::cerr << "Requested illegal viewer for perspectiveProjection()!!" << std::endl;
559 }
560 
561 void orthographicProjection( int _viewer ) {
562  if ( _viewer == ACTIVE_VIEWER ) {
563  examiner_widgets_[activeExaminer_]->orthographicProjection();
564  } else if ( _viewer == ALL_VIEWERS )
565  for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
566  examiner_widgets_[i]->orthographicProjection();
567  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
568  examiner_widgets_[_viewer]->orthographicProjection();
569  else
570  std::cerr << "Requested illegal viewer for orthographicProjection()!!" << std::endl;
571 }
572 
573 void setFOVY( double _fovy) {
574 
575  // Set FOVY for all viewers
576  for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
577  examiner_widgets_[i]->setFOVY(_fovy);
578 }
579 
580 void allowRotation(bool _mode, int _viewer ) {
581  if ( _viewer == ACTIVE_VIEWER ) {
582  examiner_widgets_[activeExaminer_]->allowRotation(_mode);
583  } else if ( _viewer == ALL_VIEWERS )
584  for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
585  examiner_widgets_[i]->allowRotation(_mode);
586  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
587  examiner_widgets_[_viewer]->allowRotation(_mode);
588  else {
589  std::cerr << "Requested illegal viewer for allowRotation!!" << std::endl;
590  return;
591  }
592 
593  if ( _viewer == ACTIVE_VIEWER )
595  else
596  viewerProperties( _viewer ).rotationLocked( !_mode );
597 }
598 
599 bool allowRotation( int _viewer ) {
600 
601  if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
602  return examiner_widgets_[_viewer]->allowRotation();
603  else {
604 
605  std::cerr << "Requested illegal viewer for isRotationAllowed!!" << std::endl;
606  return false;
607  }
608 }
609 
611  examiner_widget_->makeCurrent();
612 }
613 
614 void viewingDirection(const ACG::Vec3d &_dir, const ACG::Vec3d &_up , int _viewer ) {
615  if ( _viewer == ACTIVE_VIEWER ) {
616  examiner_widgets_[activeExaminer_]->viewingDirection(_dir,_up);
617  } else if ( _viewer == ALL_VIEWERS )
618  for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
619  examiner_widgets_[i]->viewingDirection(_dir,_up);
620  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
621  examiner_widgets_[_viewer]->viewingDirection(_dir,_up);
622  else
623  std::cerr << "Requested illegal viewer for viewingDirection!!" << std::endl;
624 }
625 
626 void lookAt(const ACG::Vec3d& _eye, const ACG::Vec3d& _center, const ACG::Vec3d& _up, int _viewer) {
627 
628  if ( _viewer == ACTIVE_VIEWER ) {
629  examiner_widgets_[activeExaminer_]->lookAt(_eye,_center, _up);
630  } else if ( _viewer == ALL_VIEWERS )
631  for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
632  examiner_widgets_[i]->lookAt(_eye,_center, _up);
633  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
634  examiner_widgets_[_viewer]->lookAt(_eye,_center, _up);
635  else
636  std::cerr << "Requested illegal viewer for viewingDirection!!" << std::endl;
637 }
638 
639 const ACG::Vec3d trackBallCenter( int _viewer ) {
640  if ( _viewer == ACTIVE_VIEWER ) {
641  return examiner_widgets_[activeExaminer_]->trackBallCenter();
642  } else if ( _viewer == ALL_VIEWERS )
643  for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
644  return examiner_widgets_[i]->trackBallCenter( );
645  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
646  return examiner_widgets_[_viewer]->trackBallCenter( );
647  else
648  std::cerr << "Requested illegal viewer for setTrackBallCenter!!" << std::endl;
649 
650  return examiner_widgets_[activeExaminer_]->trackBallCenter();
651 }
652 
653 void setTrackBallCenter(const ACG::Vec3d& _center, int _viewer ) {
654  if ( _viewer == ACTIVE_VIEWER ) {
655  examiner_widgets_[activeExaminer_]->setTrackBallCenter( _center );
656  } else if ( _viewer == ALL_VIEWERS )
657  for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
658  examiner_widgets_[i]->setTrackBallCenter( _center );
659  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
660  examiner_widgets_[_viewer]->setTrackBallCenter( _center );
661  else
662  std::cerr << "Requested illegal viewer for setTrackBallCenter!!" << std::endl;
663 }
664 
665 void setScenePos(const ACG::Vec3d& _center,const double _radius, int _viewer ) {
666  if ( _viewer == ACTIVE_VIEWER ) {
667  examiner_widgets_[activeExaminer_]->setScenePos( _center, _radius );
668  } else if ( _viewer == ALL_VIEWERS )
669  for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
670  examiner_widgets_[i]->setScenePos( _center, _radius );
671  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
672  examiner_widgets_[_viewer]->setScenePos( _center, _radius );
673  else
674  std::cerr << "Requested illegal viewer for setScenePos!!" << std::endl;
675 }
676 
677 void setScenePos(const ACG::Vec3d& _center, int _viewer ) {
678  if ( _viewer == ACTIVE_VIEWER ) {
679  examiner_widgets_[activeExaminer_]->setScenePos( _center, examiner_widgets_[activeExaminer_]->scene_radius() );
680  } else if ( _viewer == ALL_VIEWERS )
681  for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
682  examiner_widgets_[i]->setScenePos( _center, examiner_widgets_[i]->scene_radius() );
683  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
684  examiner_widgets_[_viewer]->setScenePos( _center, examiner_widgets_[_viewer]->scene_radius() );
685  else
686  std::cerr << "Requested illegal viewer for setScenePos!!" << std::endl;
687 }
688 
689 void setSceneCenter(const ACG::Vec3d& _center, int _viewer) {
690 
691  if (_viewer == ACTIVE_VIEWER) {
692  examiner_widgets_[activeExaminer_]->setSceneCenter(_center);
693  } else if (_viewer == ALL_VIEWERS) {
694 
695  for (uint i = 0; i < examiner_widgets_.size(); ++i) {
696  examiner_widgets_[i]->setSceneCenter(_center);
697  }
698  } else if ((_viewer >= 0) && _viewer < (int) examiner_widgets_.size()) {
699  examiner_widgets_[_viewer]->setSceneCenter(_center);
700  } else {
701  std::cerr << "Requested illegal viewer for setSceneCenter!!" << std::endl;
702  }
703 }
704 
705 const ACG::Vec3d sceneCenter(int _viewer) {
706 
707  if (_viewer == ACTIVE_VIEWER) {
708  return examiner_widgets_[activeExaminer_]->scene_center();
709  } else if (_viewer == ALL_VIEWERS)
710  std::cerr << "Please select viewer to get sceneCenter!" << std::endl;
711  else if ((_viewer >= 0) && _viewer < (int) examiner_widgets_.size())
712  return examiner_widgets_[_viewer]->scene_center();
713  else
714  std::cerr << "Requested illegal viewer for sceneCenter!!" << std::endl;
715 
716  return examiner_widgets_[activeExaminer_]->scene_center();
717 }
718 
719 double sceneRadius() {
720  return examiner_widgets_[activeExaminer_]->scene_radius();
721 }
722 
723 double sceneRadius( int _viewer ) {
724  if ( _viewer == ACTIVE_VIEWER ) {
725  return examiner_widgets_[activeExaminer_]->scene_radius();
726  } else if ( _viewer == ALL_VIEWERS )
727  std::cerr << "Illegal request for scene radius. Please select one viewer!" << std::endl;
728  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
729  return examiner_widgets_[_viewer]->scene_radius();
730  else
731  std::cerr << "Requested illegal viewer for translate!!" << std::endl;
732 
733  return -1;
734 }
735 
736 void translate( const ACG::Vec3d &_vector , int _viewer ) {
737  if ( _viewer == ACTIVE_VIEWER ) {
738  examiner_widgets_[activeExaminer_]->translate(_vector);
739  } else if ( _viewer == ALL_VIEWERS )
740  for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
741  examiner_widgets_[i]->translate(_vector);
742  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
743  examiner_widgets_[_viewer]->translate(_vector);
744  else
745  std::cerr << "Requested illegal viewer for translate!!" << std::endl;
746 }
747 
748 void rotate(const ACG::Vec3d& _axis,
749  const double _angle,
750  const ACG::Vec3d& _center,
751  int _viewer )
752 {
753  if ( _viewer == ACTIVE_VIEWER ) {
754  examiner_widgets_[activeExaminer_]->rotate(_axis,_angle,_center);
755  } else if ( _viewer == ALL_VIEWERS )
756  for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
757  examiner_widgets_[i]->rotate(_axis,_angle,_center);
758  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
759  examiner_widgets_[_viewer]->rotate(_axis,_angle,_center);
760  else
761  std::cerr << "Requested illegal viewer for rotate!!" << std::endl;
762 }
763 
764 void viewHome(int _viewer) {
765  if ( _viewer == ACTIVE_VIEWER ) {
766  examiner_widgets_[activeExaminer_]->home();
767  } else if ( _viewer == ALL_VIEWERS )
768  for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
769  examiner_widgets_[i]->home();
770  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
771  examiner_widgets_[_viewer]->home();
772  else
773  std::cerr << "Requested illegal viewer for viewHome!!" << std::endl;
774 }
775 
776 void viewAll(int _viewer) {
777  if ( _viewer == ACTIVE_VIEWER ) {
778  examiner_widgets_[activeExaminer_]->viewAll();
779  } else if ( _viewer == ALL_VIEWERS )
780  for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
781  examiner_widgets_[i]->viewAll();
782  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
783  examiner_widgets_[_viewer]->viewAll();
784  else
785  std::cerr << "Requested illegal viewer for viewAll!!" << std::endl;
786 }
787 
789  if ( _viewer == ACTIVE_VIEWER ) {
790  return viewerProperties(activeExaminer_).glState().viewing_direction();
791  } else if ( _viewer == ALL_VIEWERS )
792  std::cerr << "Please select viewer to get viewing direction!" << std::endl;
793  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
794  return viewerProperties(_viewer).glState().viewing_direction();
795  else
796  std::cerr << "Requested illegal viewer for viewingDirection!!" << std::endl;
797 
799 }
800 
801 bool isProjectionOrthographic( int _viewer ) {
802 
803  if ( _viewer == ACTIVE_VIEWER) {
804  return (examiner_widgets_[activeExaminer_]->projectionMode() == 0);
805  } else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() ){
806  return ( examiner_widgets_[_viewer]->projectionMode() == 0); //ORTHOGRAPHIC_PROJECTION ?
807  } else
808  std::cerr << "Requested illegal viewer for isProjectionOrthographic!!" << std::endl;
809 
810  return false;
811 }
812 
813 ACG::Vec3d eyePos(int _viewer) {
814  if ( _viewer == ACTIVE_VIEWER ) {
815  return viewerProperties(activeExaminer_).glState().eye();
816  } else if ( _viewer == ALL_VIEWERS )
817  std::cerr << "Please select viewer to get eyePos!" << std::endl;
818  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
819  return viewerProperties(_viewer).glState().eye();
820  else
821  std::cerr << "Requested illegal viewer for eyePos!!" << std::endl;
822 
823  return viewerProperties().glState().eye();
824 }
825 
826 ACG::Vec3d upVector(int _viewer) {
827  if ( _viewer == ACTIVE_VIEWER ) {
828  return viewerProperties(activeExaminer_).glState().up();
829  } else if ( _viewer == ALL_VIEWERS )
830  std::cerr << "Please select viewer to get up vector!" << std::endl;
831  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
832  return viewerProperties(_viewer).glState().up();
833  else
834  std::cerr << "Requested illegal viewer for up vector!!" << std::endl;
835 
836  return viewerProperties().glState().up();
837 }
838 
840 {
841  for ( uint i = 0 ; i < examiner_widgets_.size(); ++i )
843 }
844 
846 {
847  defaultMarker_ = _marker;
848 }
849 
851 {
852  return defaultMarker_;
853 }
854 
855 
857  return PluginFunctions::sceneGraphRootNode_;
858 }
859 
861  return PluginFunctions::dataRootNode_;
862 }
863 
865  if (PluginFunctions::sceneGraphRootNode_){
866 
867  // get the current parent Node
868  ACG::SceneGraph::BaseNode* parent = sceneGraphRootNodeGlobal_->parent();
869 
870  // Move the node to the new parent
871  _node->set_parent(parent);
872 
873  // move sceneGraphRootNodeGlobal_ to the new parent
874  sceneGraphRootNodeGlobal_->set_parent(_node);
875  }
876 }
877 
879  if (PluginFunctions::sceneGraphRootNode_)
880  _node->set_parent( PluginFunctions::sceneGraphRootNodeGlobal_ );
881 }
882 
883 
885  if (PluginFunctions::sceneGraphRootNode_){
886 
887  // get the current parent Node
888  ACG::SceneGraph::BaseNode* parent = dataRootNode_->parent();
889 
890  // Move the node to the new parent
891  _node->set_parent(parent);
892 
893  // move dataRootNode_ to the new parent
894  dataRootNode_->set_parent(_node);
895  }
896 
897 }
898 
899 int objectCount() {
900  return(objectCounter_);
901 }
902 
903 
904 
905 int targetCount() {
906  return ( targetCounter_ );
907 }
908 
909 int sourceCount() {
910  int count = 0;
911 
912  // find changed manipulator
914  o_it != PluginFunctions::objectsEnd(); ++o_it) {
915  ++count;
916  }
917 
918  return ( count );
919 }
920 
922  int count = 0;
923 
924  // find changed manipulator
926  o_it != PluginFunctions::objectsEnd(); ++o_it) {
927  if ( o_it->visible() )
928  ++count;
929  }
930 
931  return ( count );
932 
933 }
934 
935 
940 void get_all_objects( std::vector < BaseObjectData*>& _objects ) {
941 
942  _objects.clear();
943 
944  // find changed manipulator
946  o_it != PluginFunctions::objectsEnd(); ++o_it) {
947  _objects.push_back( *o_it );
948  }
949 
950 }
951 
952 
954 void flyTo (const ACG::Vec3d &_position, const ACG::Vec3d &_center, double _time) {
955  examiner_widgets_[activeExaminer_]->flyTo(_position,_center,_time);
956 }
957 
958 
960 void flyTo (const ACG::Vec3d &_center, bool _move_back, double _time) {
962  ACG::Vec3d t = _center - eye;
963  ACG::Vec3d e = eye + t * (_move_back ? -0.5f : 0.5f);
964  examiner_widgets_[activeExaminer_]->flyTo(e, _center, _time);
965 }
966 
967 
969 void viewerSnapshot(int _viewer, QImage& _image, int _width, int _height, bool _alpha,
970  bool _hideCoordsys, int _samples) {
971 
972  if ( _viewer == ACTIVE_VIEWER ) {
973  examiner_widgets_[activeExaminer_]->snapshot(_image, _width, _height, _alpha, _hideCoordsys, _samples);
974  } else if ( _viewer == ALL_VIEWERS )
975  std::cerr << "Please select viewer to get snapshot!" << std::endl;
976  else if ( ( _viewer >= 0 ) && _viewer < (int)examiner_widgets_.size() )
977  examiner_widgets_[_viewer]->snapshot(_image, _width, _height, _alpha, _hideCoordsys, _samples);
978  else
979  std::cerr << "Requested illegal viewer for snapshot!!" << std::endl;
980 }
981 
982 
983 
984 // ===============================================================================
985 // Getting data from objects and casting between them
986 // ===============================================================================
987 
989  if ( _object == 0 )
990  return 0;
991 
992  return dynamic_cast< BaseObjectData* >(_object);
993 }
994 
995 // ===============================================================================
996 // Get the root of the object structure
997 // ===============================================================================
999  return (objectRoot_);
1000 }
1001 
1003  objectCounter_++;
1004 }
1005 
1006 // Increase the number of current Object
1008  objectCounter_--;
1009 
1010  if ( objectCounter_ < 0 )
1011  std::cerr << "Deleted more objects than created!!!" << std::endl;
1012 }
1013 
1015  targetCounter_++;
1016 }
1017 
1018 // Increase the number of current Object
1020  targetCounter_--;
1021 
1022  if ( targetCounter_ < 0 )
1023  std::cerr << "target object counter underflow!!!" << std::endl;
1024 }
1025 
1026 // ===============================================================================
1027 // Add an object to the internal object map
1028 // ===============================================================================
1029 void addObjectToMap(int _objectId, BaseObject* _object) {
1030 
1031  // Look if object's id already exists in map
1032  std::map<int, BaseObject*>::iterator it;
1033  it = objectMap_.find(_objectId);
1034  // If so return
1035  if(it != objectMap_.end()) return;
1036 
1037  // Add new object to map
1038  objectMap_.insert(std::pair<int, BaseObject*>(_objectId, _object));
1039 }
1040 
1041 // ===============================================================================
1042 // Remove an object from the internal object map
1043 // ===============================================================================
1044 void removeObjectFromMap(int _objectId) {
1045 
1046  // Look if object exists in map
1047  std::map<int, BaseObject*>::iterator it;
1048  it = objectMap_.find(_objectId);
1049 
1050  // Erase entry
1051  if(it != objectMap_.end()) objectMap_.erase(it);
1052 }
1053 
1054 
1056 
1057  // Check if we already have a generator for this type.
1058  if ( sceneGraphGenerators_.contains( _generator->handles() ) )
1059  return;
1060 
1061  // Store the generator
1062  sceneGraphGenerators_[_generator->handles() ] = _generator;
1063 }
1064 
1065 
1066 QMap< std::string ,ACG::QtWidgets::SceneGraphWidgetGenerator* > getSceneGraphGeneratorList(){
1067  return sceneGraphGenerators_;
1068 }
1069 
1070 QString getOpenFileName(const QString &configProperty,
1071  QWidget * parent, const QString & caption,
1072  const QString & defaultDir, const QString & filter,
1073  QString * selectedFilter, QFileDialog::Options options) {
1074 
1075  const QString dir = OpenFlipperSettings().value(configProperty, defaultDir).toString();
1076  const QString result = QFileDialog::getOpenFileName(parent, caption, dir,
1077  filter, selectedFilter, options);
1078  if (result.length())
1079  OpenFlipperSettings().setValue(configProperty, result);
1080  return result;
1081 }
1082 
1083 QString getSaveFileName(const QString &configProperty,
1084  QWidget * parent, const QString & caption,
1085  const QString & defaultDir, const QString & filter,
1086  QString * selectedFilter, QFileDialog::Options options) {
1087 
1088  const QString dir = OpenFlipperSettings().value(configProperty, defaultDir).toString();
1089  const QString result = QFileDialog::getSaveFileName(parent, caption, dir,
1090  filter, selectedFilter, options);
1091  if (result.length())
1092  OpenFlipperSettings().setValue(configProperty, result);
1093  return result;
1094 }
1095 
1096 } // End namespace PluginFunctions