PluginFunctions.hh 15.5 KB
Newer Older
Jan Möbius's avatar
 
Jan Möbius committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//=============================================================================
//
//                               OpenFlipper
//        Copyright (C) 2008 by Computer Graphics Group, RWTH Aachen
//                           www.openflipper.org
//
//-----------------------------------------------------------------------------
//
//                                License
//
//  OpenFlipper is free software: you can redistribute it and/or modify
//  it under the terms of the GNU Lesser General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  OpenFlipper is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU Lesser General Public License for more details.
//
//  You should have received a copy of the GNU Lesser General Public License
//  along with OpenFlipper.  If not, see <http://www.gnu.org/licenses/>.
//
//-----------------------------------------------------------------------------
//
//   $Revision$
//   $Author$
//   $Date$
//
//=============================================================================




//=============================================================================
//
//  Standard Functions
//
//=============================================================================

/**
 * \file PluginFunctions.hh
 * This file contains functions which can be used by plugins to access data in the framework.
 */

//
#ifndef PLUGINFUNCTIONS_HH
#define PLUGINFUNCTIONS_HH

#include <OpenFlipper/common/Types.hh>

Jan Möbius's avatar
   
Jan Möbius committed
52
// #include <ACG/Math/VectorT.hh>
Jan Möbius's avatar
   
Jan Möbius committed
53
#include <OpenFlipper/widgets/glWidget/QtBaseViewer.hh>
Jan Möbius's avatar
 
Jan Möbius committed
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <ACG/GL/GLState.hh>

/** The Namespace PluginFunctions contains functions for all plugins. These functions should be used to get the
 *  objects to work on or to set modes in the examiner widget. */
namespace PluginFunctions {

//=======================================
// Get Source/Target objects
/** @name Active Objects
* @{ */
//=======================================

/** \brief Get the picked mesh
 * @param _node_idx Node index returned by examiner picking
 * @param _object returns the object which contains the mesh
 * @return true if mesh was found, false if picked object is not a mesh or not found
 */
DLLEXPORT
72
bool get_picked_object(const unsigned int _node_idx , BaseObjectData*& _object);
Jan Möbius's avatar
 
Jan Möbius committed
73
74
75
76

/** \brief Delete the object with the given id
 *
 *  Deletes the given object ( you have to emit the right signals yourself)\n
Jan Möbius's avatar
Jan Möbius committed
77
 *  updateView , objectListUpdate ... )
Jan Möbius's avatar
 
Jan Möbius committed
78
79
80
 * @return successful?
 * */
DLLEXPORT
81
bool deleteObject( const int _id );
Jan Möbius's avatar
 
Jan Möbius committed
82
83
84
85
86
87
88

/** \brief Delete all objects
 *
 * */
DLLEXPORT
void deleteAll( );

89
90
91
/** \brief Create a copy of the object with the given id
 *
 * Creates a copy of an object. All scenegraph nodes will be created. The object will
Jan Möbius's avatar
Jan Möbius committed
92
93
94
 * be part of the object tree at the same location as the parent of the original mesh.
 * This has to be done by setParent of the object.
 *
95
96
97
 * @return Pointer to new object or 0 if failed;
 * */
DLLEXPORT
98
int copyObject( const int _id );
99
100


Jan Möbius's avatar
 
Jan Möbius committed
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154


/** @} */

//=======================================
// Get Objects by their identifier
    /** @name Identifier handling
    * @{ */
//=======================================

/** \brief Get the identifiers of all objects marked as a source object.
 *
 * @param _identifiers ( vector returning the source object identifiers )
 * @return false, if no object is selected as source
*/
DLLEXPORT
bool get_source_identifiers( std::vector<int>& _identifiers  );

/** \brief Get the identifiers of all objects marked as a target object.
 *
 * @param _identifiers ( vector returning the target object identifiers )
 * @return false, if no object is selected as target
*/
DLLEXPORT
bool get_target_identifiers( std::vector<int>& _identifiers  );

/** \brief Get identifiers of all meshes
 *
 * @param _identifiers ( vector returning the identifiers )
 * @return false, if no mesh is found
*/
DLLEXPORT
bool get_all_meshes( std::vector<int>& _identifiers  );

/** \brief Get identifiers of all objects
 *
 * @param _identifiers ( vector returning the identifiers )
 * @return false, if no mesh is found
*/
DLLEXPORT
bool get_all_object_identifiers( std::vector<int>& _identifiers  );


/** \brief Get the object which has the given identifier.
 *
 *  Every loaded object has a unique identifier which is stored in the id field of the object container.
 *  Use this function to get the object which has this id. This can be used for a consistent mapping
 *  even if the data objects change during plugin operations (e.g. selection and main algorithm).\n
 *  This function only returns visible objects.
 * @param _identifier Object id to search for
 * @param _object  returns the object
 * @return Object found?
 */
DLLEXPORT
155
bool get_object(  const int _identifier , BaseObject*& _object );
Jan Möbius's avatar
 
Jan Möbius committed
156
157
158
159
160

/** This functions returns the object with the given id regardless of the type of object.
 * See get_object(  int _identifier , BaseObject*& _object ) for more details.
 */
DLLEXPORT
161
bool get_object(  const int _identifier , BaseObjectData*& _object );
Jan Möbius's avatar
 
Jan Möbius committed
162
163
164
165
166
167
168

/** \brief Check if an object with this identifier exists.
 *
 * Searches through the Data containers and checks if the object with the given identifier exists
 * @param _identifier  Object id to search for
 */
DLLEXPORT
169
bool object_exists(  const int _identifier );
Jan Möbius's avatar
 
Jan Möbius committed
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195

/// Get the number of available objects
DLLEXPORT
int object_count();

/// Get the number of target objects
DLLEXPORT
int target_count();

/// Get the number of source objects
DLLEXPORT
int source_count();

/// Get the number of visible objects
DLLEXPORT
int visible_count();

/** @} */

//=======================================
// Get/set status of examiner
    /** @name Examiner handling
    * @{ */
//=======================================
/// Set the internal examiner pointer ( DO NOT USE!! )
DLLEXPORT
196
void set_examiner( std::vector< QtBaseViewer* > _examiner_widgets );
Jan Möbius's avatar
Jan Möbius committed
197
198
199

/// Set the active id of the examiner which got the last mouse events
DLLEXPORT
200
void setActiveExaminer( const unsigned int _id );
Jan Möbius's avatar
 
Jan Möbius committed
201

202
203
204
205
/// Get the id of the examiner which got the last mouse events
DLLEXPORT
unsigned int activeExaminer();

Dirk Wilden's avatar
Dirk Wilden committed
206
207
208
209
210
/// Set the internal scenegraph root node pointer ( DO NOT USE!! )
DLLEXPORT
void set_sceneGraphRootNode( SeparatorNode* _root_node );

/// Set the internal data root node pointer ( DO NOT USE!! )
Jan Möbius's avatar
 
Jan Möbius committed
211
212
213
DLLEXPORT
void set_rootNode( SeparatorNode* _root_node );

Jan Möbius's avatar
Jan Möbius committed
214
215
216
217
/** Execute picking operation on scenegraph
 * This picking function will pick in the last active examiner context which is automatically
 * Set by mouseevents from the core
 */
Jan Möbius's avatar
 
Jan Möbius committed
218
219
220
DLLEXPORT
bool scenegraph_pick( ACG::SceneGraph::PickTarget _pickTarget, const QPoint &_mousePos, unsigned int &_nodeIdx, unsigned int &_targetIdx, ACG::Vec3d *_hitPointPtr );

Jan Möbius's avatar
Jan Möbius committed
221
222
223
/** Execute picking operation on scenegraph
 * This picking function will pick in the specified examiner context
 */
Jan Möbius's avatar
Jan Möbius committed
224
DLLEXPORT
225
bool scenegraph_pick( const unsigned int _examiner ,ACG::SceneGraph::PickTarget _pickTarget, const QPoint &_mousePos, unsigned int &_nodeIdx, unsigned int &_targetIdx, ACG::Vec3d *_hitPointPtr );
Jan Möbius's avatar
Jan Möbius committed
226

Jan Möbius's avatar
Jan Möbius committed
227
/** Execute Scenegraph traversal with action and use the last active examiner
Jan Möbius's avatar
Jan Möbius committed
228
229
 *  If you are reacting on a mouseEvent you should use this function as it will
 *  automatically set the right view
Jan Möbius's avatar
Jan Möbius committed
230
 */
Jan Möbius's avatar
 
Jan Möbius committed
231
232
233
DLLEXPORT
void traverse( ACG::SceneGraph::MouseEventAction  &_action );

Jan Möbius's avatar
Jan Möbius committed
234
/// Execute Scenegraph traversal with action and a specified examiner
235
void traverse(  const unsigned int _examiner, ACG::SceneGraph::MouseEventAction  &_action );
Jan Möbius's avatar
Jan Möbius committed
236

Jan Möbius's avatar
 
Jan Möbius committed
237
238
239
240
/// Get the current Picking mode
DLLEXPORT
const std::string & pickMode ();

Jan Möbius's avatar
Jan Möbius committed
241
/// Set the current Picking mode for all examiner widgets
Jan Möbius's avatar
 
Jan Möbius committed
242
243
244
DLLEXPORT
void pickMode ( std::string _mode);

Jan Möbius's avatar
Jan Möbius committed
245
246
/// Set pick mode for a specific examiner
DLLEXPORT
247
void pickMode ( const unsigned int _examiner, std::string _mode);
Jan Möbius's avatar
Jan Möbius committed
248

Jan Möbius's avatar
 
Jan Möbius committed
249
250
251
252
253
254
/// Get the current gl state from examiner
DLLEXPORT
ACG::GLState&  glState();

/// Returns a QImage of the current View
DLLEXPORT
Jan Möbius's avatar
Jan Möbius committed
255
void getCurrentViewImage(QImage& _image);
Jan Möbius's avatar
 
Jan Möbius committed
256

Dirk Wilden's avatar
Dirk Wilden committed
257
258
259
260
/// Get the root node
DLLEXPORT
ACG::SceneGraph::BaseNode* getSceneGraphRootNode();

Jan Möbius's avatar
 
Jan Möbius committed
261
262
263
264
/// Get the root node
DLLEXPORT
ACG::SceneGraph::BaseNode* getRootNode();

Dirk Wilden's avatar
Dirk Wilden committed
265
266
267
268
269
270
271
272
/// Add a node under the root node
DLLEXPORT
void addNode(ACG::SceneGraph::BaseNode* _node);

/// Add a node between root node and its children
DLLEXPORT
void addGlobalNode(ACG::SceneGraph::BaseNode* _node);

Jan Möbius's avatar
 
Jan Möbius committed
273
274
/// Set the current Action Mode (PickMode,ExamineMode,...)
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
275
void actionMode ( QtBaseViewer::ActionMode _mode);
Jan Möbius's avatar
 
Jan Möbius committed
276
277
278

/// Get the current Action mode
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
279
QtBaseViewer::ActionMode actionMode();
Jan Möbius's avatar
 
Jan Möbius committed
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309

/** Lock scene rotation via mouse
 *
 * @param _mode allow or disallow rotation
 */
DLLEXPORT
void allowRotation(bool _mode);


/** @} */


//=======================================
// View settings
    /** @name View settings
    * @{ */
//=======================================

/** \brief Set the viewing direction
 * @param _dir direction
 * @param _up up vector
 */
DLLEXPORT
void viewingDirection(const ACG::Vec3d &_dir, const ACG::Vec3d &_up);

/** \brief Set the Scene position
 * @param _center Center of the current scene
 * @param _radius Radius of the scene ( Use scene_radius to get the current radius )
 */
DLLEXPORT
310
void setScenePos(const ACG::Vec3d& _center, const double _radius);
Jan Möbius's avatar
 
Jan Möbius committed
311
312

/** \brief Set the scene position (Same as  setScenePos(const ACG::Vec3d& _center, double _radius) )
Jan Möbius's avatar
Jan Möbius committed
313
 *
Jan Möbius's avatar
 
Jan Möbius committed
314
315
316
317
318
 */
DLLEXPORT
void setScenePos(const ACG::Vec3d& _center);

/** \brief Get the current scene center
Jan Möbius's avatar
Jan Möbius committed
319
 *
Jan Möbius's avatar
 
Jan Möbius committed
320
321
322
323
324
 */
DLLEXPORT
const ACG::Vec3d& sceneCenter();

/** \brief Returns the current scene radius from the examiner widget
Jan Möbius's avatar
Jan Möbius committed
325
 *
Jan Möbius's avatar
 
Jan Möbius committed
326
327
328
329
330
331
 * Returns the Radius of the scene
 */
DLLEXPORT
double sceneRadius();

/** \brief Translate viewer pos by given vector
Jan Möbius's avatar
Jan Möbius committed
332
 *
Jan Möbius's avatar
 
Jan Möbius committed
333
334
335
336
337
338
339
340
 * Translates the scene by a given vector. ( This is only a view transformation and does not
 * effect the scene center. To really translate the scene, use setScenePos );
 * @param _vector translation
 */
DLLEXPORT
void translate( const ACG::Vec3d &_vector );

/** \brief Rotate Scene around axis
Jan Möbius's avatar
Jan Möbius committed
341
342
 *
 * Rotates the current scene.
Jan Möbius's avatar
 
Jan Möbius committed
343
344
345
346
347
 * @param _axis   Rotation axis
 * @param _angle  Rotation Angle
 * @param _center Rotation Center
 */
DLLEXPORT
Jan Möbius's avatar
Jan Möbius committed
348
void rotate(const ACG::Vec3d&  _axis,
349
            const double       _angle,
Jan Möbius's avatar
 
Jan Möbius committed
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
            const ACG::Vec3d&  _center);


/** \brief Go to home position
 */
DLLEXPORT
void viewHome();

/** \brief View the whole scene
 */
DLLEXPORT
void viewAll();

/** \brief Get the current viewing Direction
 */
DLLEXPORT
ACG::Vec3d viewingDirection();

/** \brief Get the current viewer position
 */
DLLEXPORT
ACG::Vec3d eyePos();

/** \brief Get the current up vector
 */
DLLEXPORT
ACG::Vec3d upVector();

/** \brief Switch to orthographic Projection
 *
 */
DLLEXPORT
void orthographicProjection();

/** \brief Switch to perspective Projection
 *
 */
DLLEXPORT
void perspectiveProjection();

/** \brief Switch to a different draw mode
 *
 */
DLLEXPORT
394
void setDrawMode( const unsigned int _mode );
Jan Möbius's avatar
 
Jan Möbius committed
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412

/** \brief Get the current draw Mode
 *
 */
DLLEXPORT
unsigned int drawMode( );

/** \brief Set the background color of the examiner widget.
 *
 */
DLLEXPORT
void setBackColor( OpenMesh::Vec4f _color);


/** \brief Map coordinates of GL Widget to global coordinates
 *
 */
DLLEXPORT
413
QPoint mapToGlobal( const QPoint _point );
Jan Möbius's avatar
 
Jan Möbius committed
414
415
416
417
418

/** \brief Map global coordinates to GL Widget local coordinates
 *
 */
DLLEXPORT
419
QPoint mapToLocal( const QPoint _point );
Jan Möbius's avatar
 
Jan Möbius committed
420
421
422
423
424
425
426
427
428
429

/** @} */


//=======================================
// Do animations in examiner viewer
    /** @name Animations
    * @{ */
//=======================================

Jan Möbius's avatar
   
Jan Möbius committed
430
/**  Fly to point and set new viewing direction (animated).
Jan Möbius's avatar
Jan Möbius committed
431
432
433
434
 * @param _position New viewer position ( the new eye point of the viewer )
 * @param _center   The new scene center ( the point we are looking at )
 * @param _time     Animation time in ms
 */
Jan Möbius's avatar
 
Jan Möbius committed
435
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
436
void flyTo (const ACG::Vec3d &_position, const ACG::Vec3d &_center, double _time=1000.0);
Jan Möbius's avatar
 
Jan Möbius committed
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457

/** @} */


//=======================================
// Iterators for object Access
    /** @name Iterators
    * @{ */
//=======================================

enum IteratorRestriction {
   ALL_OBJECTS,
   TARGET_OBJECTS,
   SOURCE_OBJECTS
};

/** \brief Core Data Iterator
 *
 * This is the core iterator for the whole framework. You should use this iterator to access your data.\n
 * You can Choose if the iterator returns only Target, Source or all objects.\n
 * Additionally you can set the type of objects returned by the iterator.
Jan Möbius's avatar
Jan Möbius committed
458
 * The ObjectIterator will only return real Objects. Groups are not considered to be objects
Jan Möbius's avatar
 
Jan Möbius committed
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
 */
class DLLEXPORT ObjectIterator {

   public :

      /// type of the Objects the iterator works on
      typedef BaseObjectData  value_type;

      /// handle type (just an int)
      typedef BaseObjectData* value_handle;

      /// reference type
      typedef value_type&     reference;

      /// basic pointer type
      typedef value_type*     pointer;

   /** \brief Use this constructor for iterating through your data.
    *
    * @param _restriction Use this parameter to define which objects will be returned.\n
    *                     You can select between ALL_OBJECTS , TARGET_OBJECTS , SOURCE_OBJECTS.
    * @param _dataType Use this parameter to select the returned object types.
    *                  You can use DATA_ALL DATA_POLY_MESH DATA_TRIANGLE_MESH DATA_VOLUME
    */
   ObjectIterator(IteratorRestriction _restriction = ALL_OBJECTS , DataType _dataType = DATA_ALL );

   /// additional constructor starting at a given position
   ObjectIterator(BaseObjectData* pos, IteratorRestriction _restriction = ALL_OBJECTS , DataType _dataType = DATA_ALL );

   /// return the current position of the iterator
   operator value_handle() { return pos_;  };

   /// compare iterators
   bool operator==( const ObjectIterator& _rhs);

   /// compare iterators
   bool operator!=( const ObjectIterator& _rhs);

   /// assign iterators
   ObjectIterator& operator=( const ObjectIterator& _rhs);

   /// dereference
   pointer operator->();

   /// next element
   ObjectIterator& operator++();

   /// last element
   ObjectIterator& operator--();

   /// dereference the iterator
   BaseObjectData* operator*();

   /// return current position of the iterator
   BaseObjectData* index() { return pos_; };

   private :
      /// current position of the iterator
      BaseObjectData* pos_;

      /// returned data types of the iterator
      DataType dataType_;

      /// Restriction of the iterator
      IteratorRestriction restriction_;

Jan Möbius's avatar
Jan Möbius committed
525
526
527
528
529
      /** Takes an object and goes through the object tree to the next BaseObjectData
        *  It stops at the root node.
        */
      inline void proceedToNextBaseObjectData(BaseObject*& _object);

Jan Möbius's avatar
 
Jan Möbius committed
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
};

// /// Return Iterator to Mesh End
// MeshIterator meshes_end();

/// Return Iterator to Object End
DLLEXPORT
ObjectIterator objects_end();

/** @} */

//=======================================
// Dont Use functions below!!!
    /** @name Do never use!!
    * @{ */
//=======================================

/** Set the global DataContainer*/
DLLEXPORT
void setDataRoot( BaseObject* _root );

/** @} */

//=======================================
    /** @name Getting data from objects and casting between them
     * @{ */
//=======================================

/** \brief Cast an BaseObject to a BaseObjectData if possible
 *
 * @param _object The object should be of type BaseObject. If the content is a BaseObjectData, a
 *                a BaseObjectData is returned. Otherwise a NULL pointer is returned.
 */
DLLEXPORT
BaseObjectData* baseObjectData( BaseObject* _object );

/** @} */

/// Get the root of the object structure
DLLEXPORT
Jan Möbius's avatar
Jan Möbius committed
570
BaseObject*& objectRoot();
Jan Möbius's avatar
 
Jan Möbius committed
571
572
573
574

}

#endif //PLUGINFUNCTIONS_HH