Developer Documentation
MeshObjectT_impl.hh
1 /*===========================================================================*\
2 * *
3 * OpenFlipper *
4  * Copyright (c) 2001-2015, RWTH-Aachen University *
5  * Department of Computer Graphics and Multimedia *
6  * All rights reserved. *
7  * www.openflipper.org *
8  * *
9  *---------------------------------------------------------------------------*
10  * This file is part of OpenFlipper. *
11  *---------------------------------------------------------------------------*
12  * *
13  * Redistribution and use in source and binary forms, with or without *
14  * modification, are permitted provided that the following conditions *
15  * are met: *
16  * *
17  * 1. Redistributions of source code must retain the above copyright notice, *
18  * this list of conditions and the following disclaimer. *
19  * *
20  * 2. Redistributions in binary form must reproduce the above copyright *
21  * notice, this list of conditions and the following disclaimer in the *
22  * documentation and/or other materials provided with the distribution. *
23  * *
24  * 3. Neither the name of the copyright holder nor the names of its *
25  * contributors may be used to endorse or promote products derived from *
26  * this software without specific prior written permission. *
27  * *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39 * *
40 \*===========================================================================*/
41 
42 
43 
44 
45 
46 
47  //=============================================================================
48  //
49  // MyTypes
50  //
51  //=============================================================================
52 
53  #define MESHOBJECT_C
54 
55 
56  //== INCLUDES =================================================================
57 
59  #include <ACG/Scenegraph/DrawModes.hh>
62 
63  #include <ACG/Scenegraph/ManipulatorNode.hh>
64  #include <ACG/Scenegraph/BoundingBoxNode.hh>
65  #include <ACG/QtScenegraph/QtTranslationManipulatorNode.hh>
66 
67 
68  //== TYPEDEFS =================================================================
69 
70  //== CLASS DEFINITION =========================================================
71 
72  template < class MeshT >
74  BaseObjectData(_object),
75  statusNode_(0),
76  areaNode_(0),
77  handleNode_(0),
78  featureNode_(0),
79  meshNode_(0),
80  textureNode_(0),
81  shaderNode_(0),
82  statusView_(0),
83  triangle_bsp_(0)
84  {
85  init(_object.mesh_);
86 
87 
88  setName( name() );
89 
90 // textures_ = _object.textures_;
91 // textureNames_ = _object.textureNames_;
92  }
93 
101  template < class MeshT >
103  BaseObjectData(),
104  mesh_(0),
105  statusNode_(0),
106  areaNode_(0),
107  handleNode_(0),
108  featureNode_(0),
109  meshNode_(0),
110  textureNode_(0),
111  shaderNode_(0),
112  statusView_(0),
113  triangle_bsp_(0)
114  {
115  setDataType(_typeId);
116  init();
117  }
118 
122  template < class MeshT >
124  {
125  // Delete the data attached to this object ( this will remove all perObject data)
126  // Not the best way to do it but it will work.
127  // This is only necessary if people use references to the mesh below and
128  // they do something with the mesh in the destructor of their
129  // perObjectData.
130  deleteData();
131 
132  // Delete the Mesh only, if this object contains a mesh
133  if ( mesh_ != NULL) {
134  delete mesh_;
135  mesh_ = NULL;
136  } else {
137  std::cerr << "Destructor error : Mesh already deleted" << std::endl;
138  }
139 
140  if ( triangle_bsp_ != 0 )
141  delete triangle_bsp_;
142  triangle_bsp_ = 0;
143 
144  // No need to delete the scenegraph Nodes as this will be managed by baseplugin
145  areaNode_ = 0;
146  handleNode_ = 0;
147  featureNode_ = 0;
148  meshNode_ = 0;
149  textureNode_ = 0;
150  shaderNode_ = 0;
151  statusView_ = 0;
152  }
153 
157  template < class MeshT >
159  // Delete the Mesh only, if this object contains a mesh
160  if ( mesh_ != NULL) {
161  delete mesh_;
162  mesh_ = NULL;
163  } else {
164  std::cerr << "Cleanup error : Triangle Mesh already deleted" << std::endl;
165  }
166 
167  if ( triangle_bsp_ != 0 )
168  delete triangle_bsp_;
169  triangle_bsp_ = 0;
170 
172 
173  statusNode_ = 0;
174  areaNode_ = 0;
175  handleNode_ = 0;
176  featureNode_ = 0;
177  textureNode_ = 0;
178  shaderNode_ = 0;
179  meshNode_ = 0;
180  statusView_ = 0;
181 
182  init();
183 
184  }
185 
189  template < class MeshT >
190  void MeshObject< MeshT >::init(MeshT* _mesh) {
191 
192  if ( _mesh == 0 )
193  mesh_ = new MeshT();
194  else
195  mesh_ = new MeshT(*_mesh);
196 
197  // Prepare mesh and request required properties
198  mesh_->request_vertex_normals();
199  mesh_->request_face_normals();
200  mesh_->request_vertex_status();
201  mesh_->request_halfedge_status();
202  mesh_->request_face_status();
203  mesh_->request_edge_status();
204  mesh_->request_vertex_colors();
205  mesh_->request_face_colors();
206 
207  // Only initialize scenegraph nodes when we initialized a gui!!
208  if ( OpenFlipper::Options::nogui() )
209  return;
210 
211  // This should never happen!
212  if ( manipulatorNode() == NULL)
213  std::cerr << "Error when creating Mesh Object! manipulatorNode is NULL!" << std::endl;
214 
215 
216  textureNode_ = new ACG::SceneGraph::EnvMapNode(materialNode(),"NEW TextureNode for ", true, GL_LINEAR_MIPMAP_LINEAR );
217 
218  shaderNode_ = new ACG::SceneGraph::ShaderNode(textureNode() , "NEW ShaderNode for ");
219 
221 
222  QString shaderDir = OpenFlipper::Options::shaderDirStr() + OpenFlipper::Options::dirSeparator();
223 
224  std::string shaderDirectory = std::string( shaderDir.toUtf8() );
225  shaderNode_->setShaderDir( shaderDirectory );
226 
227  if(!OpenFlipper::Options::coreProfile())
228  {
229  if ( QFile( shaderDir + "Phong/Vertex.glsl").exists() && QFile( shaderDir + "Phong/Fragment.glsl" ).exists() )
230  shaderNode_->setShader(ACG::SceneGraph::DrawModes::SOLID_PHONG_SHADED,"Phong/Vertex.glsl" , "Phong/Fragment.glsl" );
231  else
232  std::cerr << "Shader Files for Phong not found!" << std::endl;
233  }
234 
235  // Node showing selection
236  statusNode_ = new ACG::SceneGraph::SelectionNodeT<MeshT>(*mesh_, 0, "NEW StatusNode for mesh " );
237  statusNode_->set_point_size(4.0);
238  statusNode_->set_color(ACG::Vec4f(1.0f,0.0f,0.0f,1.0f));
239  statusNode_->set_base_color(ACG::Vec4f(1.0f,0.0f,0.0f,1.0f));
240  // Status nodes are handled specially by their StatusViewNodeT parent which
241  // is why they get a NONE draw mode.
243 
244  // Node showing modeling region
245  areaNode_ = new ACG::SceneGraph::StatusNodeT<MeshT, AreaNodeMod<MeshT> >(*mesh_, 0, "NEW AreaNode for mesh ");
246  areaNode_->set_round_points(true);
247  areaNode_->enable_alpha_test(0.5);
248  areaNode_->set_point_size(7.0);
249  areaNode_->set_color(ACG::Vec4f(0.4f, 0.4f, 1.0f, 1.0f));
250  // Status nodes are handled specially by their StatusViewNodeT parent which
251  // is why they get a NONE draw mode.
253 
254  // Node showing handle region
255  handleNode_ = new ACG::SceneGraph::StatusNodeT<MeshT, HandleNodeMod<MeshT> >(*mesh_, 0, "NEW HandleNode for mesh ");
256  handleNode_->set_round_points(true);
257  handleNode_->enable_alpha_test(0.5);
258  handleNode_->set_line_width(2.0);
259  handleNode_->set_point_size(7.0);
260  handleNode_->set_color(ACG::Vec4f(0.2f, 1.0f, 0.2f, 1.0f));
261  // Status nodes are handled specially by their StatusViewNodeT parent which
262  // is why they get a NONE draw mode.
264 
265  // Node showing feature selection
266  featureNode_ = new ACG::SceneGraph::StatusNodeT<MeshT, FeatureNodeMod<MeshT> >(*mesh_, 0, "NEW FeatureNode for mesh ");
267  featureNode_->set_round_points(true);
268  featureNode_->enable_alpha_test(0.5);
269  featureNode_->set_line_width(2.0);
270  featureNode_->set_point_size(7.0);
271  featureNode_->set_color(ACG::Vec4f(1.0f, 0.2f, 1.0f, 1.0f));
272  featureNode_->set_base_color(ACG::Vec4f(1.0f, 0.2f, 1.0f, 1.0f));
273  // Status nodes are handled specially by their StatusViewNodeT parent which
274  // is why they get a NONE draw mode.
276 
277  // Link the status nodes to the draw mesh of the mesh below them to reuse its buffers
278  if (meshNode_) {
283  }
284 
285  // Node rendering selections in correct order
286  statusView_ = new ACG::SceneGraph::StatusViewNodeT<MeshT>(manipulatorNode(), "NEW StatusViewNode for mesh ",
287  statusNode_,
288  areaNode_,
289  handleNode_,
290  featureNode_);
291 
292  // make StatusViewNode parent of status nodes
293  statusNode_->set_parent(statusView_);
294  areaNode_->set_parent(statusView_);
295  handleNode_->set_parent(statusView_);
296  featureNode_->set_parent(statusView_);
297 
298  // Update all nodes
299  update();
300  }
301 
302  // ===============================================================================
303  // Name/Path Handling
304  // ===============================================================================
305 
309  template < class MeshT >
310  void MeshObject< MeshT >::setName( QString _name ) {
312 
313  // No update when gui is not active
314  if ( OpenFlipper::Options::nogui() )
315  return;
316 
317  std::string nodename = std::string("StatusNode for mesh " + _name.toUtf8() );
318  statusNode_->name( nodename );
319 
320  nodename = std::string("AreaNode for mesh " + _name.toUtf8() );
321  areaNode_->name( nodename );
322 
323  nodename = std::string("HandleNode for mesh " + _name.toUtf8() );
324  handleNode_->name( nodename );
325 
326  nodename = std::string("FeatureNode for mesh " + _name.toUtf8() );
327  featureNode_->name( nodename );
328 
329  nodename = std::string("TextureNode for mesh "+ _name.toUtf8() );
330  textureNode_->name( nodename );
331 
332  nodename = std::string("ShaderNode for mesh "+ _name.toUtf8() );
333  shaderNode_->name( nodename );
334 
335  nodename = std::string("MeshNode for mesh " + _name.toUtf8() );
336  meshNode_->name( nodename );
337 
338  nodename = std::string("StatusViewNode for mesh " + _name.toUtf8() );
339  statusView_->name( nodename );
340  }
341 
342  // ===============================================================================
343  // Content
344  // ===============================================================================
345 
349  template < class MeshT >
351  return mesh_;
352  }
353 
357  template < class MeshT >
358  const MeshT* MeshObject< MeshT >::mesh() const {
359  return mesh_;
360  }
361 
366  template < class MeshT >
368 
369  // No update necessary if no gui
370  if ( OpenFlipper::Options::nogui() )
371  return;
372 
374 
375  if ( _type.contains(UPDATE_ALL) || _type.contains(UPDATE_TOPOLOGY) ){
376  updateGeometry();
377  updateColor();
378  updateTopology();
379  updateSelection();
380  updateFeatures();
382  updateTexture();
383  }
384  else
385  {
386  if ( _type.contains(UPDATE_GEOMETRY) ) {
387  updateGeometry();
388  }
389  if ( _type.contains(UPDATE_SELECTION) ) {
390  updateSelection();
391  updateFeatures();
393  }
394  if ( _type.contains(UPDATE_COLOR) ) {
395  updateColor();
396  }
397  if ( _type.contains(UPDATE_TEXTURE)) {
398  updateTexture();
399  }
400  }
401  }
402 
404  template < class MeshT >
406 
407  if ( statusNode_ ){
409  }
410  }
411 
413  template < class MeshT >
415 
416  if ( meshNode_ ) {
418 
419  // Also update the selection nodes here.
420  // These nodes store their positions based on the mesh.
421  // So they would be at the wrong position afterwards
426 
427  }
428 
430  }
431 
433  template < class MeshT >
435  if ( meshNode_ )
437  }
438 
440  template < class MeshT >
442  if ( meshNode_ ) {
448  }
450  }
451 
453  template < class MeshT >
455  if ( areaNode_ && handleNode_ ) {
458  }
459  }
460 
462  template < class MeshT >
464  if ( featureNode_ )
466  }
467 
469  template < class MeshT >
472  }
473 
474 
475  // ===============================================================================
476  // Visualization
477  // ===============================================================================
478  template < class MeshT >
480  {
481  if (statusNode_)
482  {
483  statusNode_->set_color(_color);
484  statusNode_->set_base_color(_color);
485  }
486  }
487 
488  template < class MeshT >
490  {
491  if (statusNode_)
492  return statusNode_->base_color();
493  else
494  return ACG::Vec4f(-1.f,-1.f,-1.f,-1.f);
495  }
496 
497  template < class MeshT >
499  {
500  if (areaNode_)
501  {
502  areaNode_->set_color(_color);
503  areaNode_->set_base_color(_color);
504  }
505  }
506  template < class MeshT >
508  {
509  if (areaNode_)
510  return areaNode_->base_color();
511  else
512  return ACG::Vec4f(-1.f,-1.f,-1.f,-1.f);
513  }
514 
515  template < class MeshT >
517  {
518  if (featureNode_)
519  {
520  featureNode_->set_color(_color);
521  featureNode_->set_base_color(_color);
522  }
523  }
524  template < class MeshT >
526  {
527  if (featureNode_)
528  return featureNode_->base_color();
529  else
530  return ACG::Vec4f(-1.f,-1.f,-1.f,-1.f);
531  }
532 
533  template < class MeshT >
535  {
536  if (handleNode_)
537  {
538  handleNode_->set_color(_color);
539  handleNode_->set_base_color(_color);
540  }
541  }
542  template < class MeshT >
544  {
545  if (handleNode_)
546  return handleNode_->base_color();
547  else
548  return ACG::Vec4f(-1.f,-1.f,-1.f,-1.f);
549  }
550 
551 
555  template < class MeshT >
557  return textureNode_;
558  }
559 
563  template < class MeshT >
565  return shaderNode_;
566  }
567 
570  template < class MeshT >
572 
573  if ( _hide ) {
575  } else {
577  }
578 
579  }
580 
581  template < class MeshT >
583  if ( _hide ) {
585  } else {
587  }
588  }
589 
590  template < class MeshT >
592  return ( featureNode_->status() == ACG::SceneGraph::BaseNode::Active );
593  }
594 
597  template < class MeshT >
598  void MeshObject< MeshT >::hideArea( StatusBits _bit, bool _hide ) {
600 
601  if ( _hide ) {
603  }else
605 
606  if ( _bit & AREA ) {
607  areaNode_->set_status( status );
608  }
609 
610  if ( _bit & HANDLEAREA )
611  handleNode_->set_status( status );
612 
613  }
614 
615  template < class MeshT >
617  return ( statusNode_->status() == ACG::SceneGraph::BaseNode::Active );
618  }
619 
620  template < class MeshT >
621  bool MeshObject< MeshT >::areaVisible( StatusBits _bit ) {
622  bool status = true;
623 
624  if ( _bit & AREA )
625  status &= ( areaNode_->status() == ACG::SceneGraph::BaseNode::Active );
626 
627  if ( _bit & HANDLEAREA )
628  status &= ( handleNode_->status() == ACG::SceneGraph::BaseNode::Active );
629 
630  return status;
631  }
632 
636  template < class MeshT >
638  return meshNode_;
639  }
640 
643  template < class MeshT >
645  if ( meshNode_ ) {
646  _bbMin = ACG::Vec3d(FLT_MAX, FLT_MAX, FLT_MAX);
647  _bbMax = ACG::Vec3d(-FLT_MAX, -FLT_MAX, -FLT_MAX);
648  meshNode_->boundingBox(_bbMin,_bbMax);
649  } else {
650  std::cerr << "Error: Bounding box computation via Scenegraph not available without gui" << std::endl;
651  }
652  }
653 
654  // ===============================================================================
655  // Load/Save
656  // ===============================================================================
657 
663  template < class MeshT >
664  bool MeshObject< MeshT >::loadMesh(QString _filename) {
665 
666  setFromFileName(_filename);
667 
668  // call the local function to update names
669  setName( name() );
670 
671  std::string filename = std::string( _filename.toUtf8() );
672 
673  // load file
674  bool ok = OpenMesh::IO::read_mesh( (*mesh()) , filename );
675  if (!ok)
676  {
677  if ( dataType() == typeId("TriangleMesh") )
678  std::cerr << "Main Application : Read error for Triangle Mesh at "<< filename << std::endl;
679  if ( dataType() == typeId("PolyMesh") )
680  std::cerr << "Main Application : Read error for Poly Mesh\n";
681  return false;
682  }
683 
684  mesh()->update_normals();
685 
686  update();
687 
688  show();
689 
690  return true;
691  }
692 
693  // ===============================================================================
694  // Object information
695  // ===============================================================================
696 
702  template < class MeshT >
704  QString output;
705 
706  output += "========================================================================\n";
707  output += BaseObjectData::getObjectinfo();
708 
709  if ( dataType( typeId("TriangleMesh") ) )
710  output += "Object Contains Triangle Mesh : ";
711 
712  if ( dataType( typeId("PolyMesh") ) )
713  output += "Object Contains Poly Mesh : ";
714 
715  output += QString::number( mesh()->n_vertices() ) + " vertices, ";
716  output += QString::number( mesh()->n_edges() ) += " edges ";
717  output += QString::number( mesh()->n_faces() ) += " faces.\n";
718 
719  output += "========================================================================\n";
720  return output;
721  }
722 
723  // ===============================================================================
724  // Picking
725  // ===============================================================================
726 
733  template < class MeshT >
734  bool MeshObject< MeshT >::picked( uint _node_idx ) {
735  return ( _node_idx == meshNode_->id() );
736  }
737 
738 
739  template < class MeshT >
740  void MeshObject< MeshT >::enablePicking( bool _enable ) {
741  if ( OpenFlipper::Options::nogui())
742  return;
743 
744  meshNode_->enablePicking( _enable );
745  areaNode_->enablePicking( _enable );
746  handleNode_->enablePicking( _enable );
747  featureNode_->enablePicking( _enable );
748  textureNode_->enablePicking( _enable );
749  shaderNode_->enablePicking( _enable );
750  }
751 
752  template < class MeshT >
754  return meshNode_->pickingEnabled();
755  }
756 
757  // ===============================================================================
758  // Octree
759  // ===============================================================================
760 
761  template < class MeshT >
764 
765  if ( ! dataType( typeId("TriangleMesh") ) ) {
766  std::cerr << "Bsps are only supported for triangle meshes." << std::endl;
767  return 0;
768  }
769 
770  // Create the tree if needed.
771  if ( triangle_bsp_ == 0 )
772  {
773  // create Triangle BSP
774  triangle_bsp_ = new OMTriangleBSP( *mesh() );
775 
776  // build Triangle BSP
777  triangle_bsp_->reserve(mesh()->n_faces());
778 
779  typename MeshT::FIter f_it = mesh()->faces_begin();
780  typename MeshT::FIter f_end = mesh()->faces_end();
781 
782  for (; f_it!=f_end; ++f_it)
783  triangle_bsp_->push_back(*f_it);
784 
785  triangle_bsp_->build(10, 100); //max vertices per leaf 10, max depth 100
786  }
787 
788  // return pointer to triangle bsp
789  return triangle_bsp_;
790  }
791 
792  template < class MeshT >
795  if ( triangle_bsp_ != 0 )
796  {
797  delete triangle_bsp_;
798  triangle_bsp_ = 0;
799  }
800 
801  return requestTriangleBsp();
802  }
803 
804  template < class MeshT >
805  void
807  if ( triangle_bsp_ != 0 )
808  {
809  delete triangle_bsp_;
810  triangle_bsp_ = 0;
811  }
812  }
813 
814 
815  template < class MeshT >
816  bool
818  return triangle_bsp_ != 0;
819  }
820 
821 
822  //=============================================================================
823 
824  template < class MeshT >
825  BaseNode*
827  return boundingBoxNode();
828  }
829 
830  //=============================================================================
831 
virtual QString getObjectinfo()
Get all Info for the Object as a string.
Definition: BaseObject.cc:244
BaseNode * primaryNode()
Status Node for a mesh, visualizing the selection state of a mesh.
const UpdateType UPDATE_TOPOLOGY(UpdateTypeSet(8))
Topology updated.
bool areaVisible(StatusBits _bit)
Return if the selected areas are currently visible.
void updateFeatures()
Update Feature Visualization Node.
void invalidateTriangleBsp()
void updateGeometry()
Update Geometry of all data structures.
void deleteData()
Delete all data attached to this object ( calls delete on each object )
Definition: BaseObject.cc:812
void set_parent(BaseNode *_parent)
Set the parent of this node.
Definition: BaseNode.cc:146
ACG::SceneGraph::MeshNodeT< MeshT > * meshNode_
Scenegraph Mesh Node.
Definition: MeshObjectT.hh:294
OMTriangleBSP * requestTriangleBsp()
virtual void show()
Sets the whole Scenegraph subtree of this node to visible.
void hideSelection(bool _hide)
Hide or show the selection Node of the object.
virtual void setName(QString _name) override
path to the file from which the object is loaded ( defaults to "." )
const UpdateType UPDATE_ALL(UpdateTypeSet(1))
Identifier for all updates.
virtual ~MeshObject()
destructor
DrawMeshT< Mesh > * getDrawMesh()
Get DrawMesh instance.
ACG::Vec4f selectionColor() const
get color for selection. returns -1 vector, if handle node does not exists
void hideFeatures(bool _hide)
Hide or show the feature Node of the object.
std::string name() const
Returns: name of node (needs not be unique)
Definition: BaseNode.hh:415
void updateSelection()
Call this function to update the modeling regions.
VectorT< float, 4 > Vec4f
Definition: VectorT.hh:138
void setDrawMesh(DrawMeshT< Mesh > *_drawmesh)
Set drawmesh.
const UpdateType UPDATE_SELECTION(UpdateTypeSet(16))
Selection updated.
ACG::SceneGraph::ShaderNode * shaderNode_
Scenegraph ShaderNode.
Definition: MeshObjectT.hh:300
void setHandleColor(const ACG::Vec4f &_color)
set color for handles
void boundingBox(Vec3d &_bbMin, Vec3d &_bbMax) override
Current bounding box.
void enablePicking(bool _enable)
Definition: BaseNode.hh:265
bool loadMesh(QString _filename)
Load a mesh from the given file.
void update_geometry()
the geometry of the mesh has changed
void hideArea(StatusBits _bit, bool _hide)
Hide or show the area Nodes of the object.
Predefined datatypes.
Definition: DataTypes.hh:83
QString filename() const
return the filename of the object
Definition: BaseObject.cc:706
void updateTexture()
Update Texture of all data structures.
void build(unsigned int _max_handles, unsigned int _max_depth)
const UpdateType UPDATE_TEXTURE(UpdateTypeSet(2048))
Textures have changed.
Draw node & children.
Definition: BaseNode.hh:392
void update_textures()
force an texture update
ACG::SceneGraph::StatusNodeT< MeshT, FeatureNodeMod< MeshT > > * featureNode_
Feature selection Vis.
Definition: MeshObjectT.hh:291
MeshT * mesh()
return a pointer to the mesh
const UpdateType UPDATE_GEOMETRY(UpdateTypeSet(4))
Geometry updated.
virtual void init(MeshT *_mesh=0)
Initialise current object, including all related nodes.
OMTriangleBSP * triangle_bsp_
If requested a bsp is created for this object.
Definition: MeshObjectT.hh:390
void updateSelection()
set selection invalid (Only selection changed, rest is kept)
QtTranslationManipulatorNode * manipulatorNode()
void setName(QString _name)
Set the name of the Object.
DrawMode SOLID_PHONG_SHADED
draw phong shaded faces
Definition: DrawModes.cc:83
virtual void cleanup() override
void push_back(Handle _h)
Add a handle to the BSP.
void updateGeometry()
set geometry invalid, topology and selection is kept
OMTriangleBSP * resetTriangleBsp()
ACG::SceneGraph::StatusViewNodeT< MeshT > * statusView_
Scenegraph StatusNodeView.
Definition: MeshObjectT.hh:303
bool read_mesh(Mesh &_mesh, const std::string &_filename)
Read a mesh from file _filename.
Definition: MeshIO.hh:95
bool selectionVisible()
return if the selections are currently visible
BoundingBoxNode * boundingBoxNode()
get a pointer to the bounding box node
void updateColor()
Update Colors of all data structures.
bool featuresVisible()
return if the feature Node of the object is currently visible
ACG::Vec4f areaColor() const
get color for areas. returns -1 vector, if handle node does not exists
void update_topology()
the topology of the mesh has changed
void setAreaColor(const ACG::Vec4f &_color)
set color for areas
QString name() const
return the name of the object. The name defaults to NONAME if unset.
Definition: BaseObject.cc:730
ACG::Vec4f handleColor() const
get color for handles. returns -1 vector, if handle node does not exists
QString getObjectinfo()
Get all Info for the Object as a string.
void update_color()
the colors of the mesh have changed
DrawMode NONE
not a valid draw mode
Definition: DrawModes.cc:71
Update type class.
Definition: UpdateType.hh:59
virtual void cleanup()
Reset current object, including all related nodes.
ACG::SceneGraph::StatusNodeT< MeshT, AreaNodeMod< MeshT > > * areaNode_
Area selection Vis.
Definition: MeshObjectT.hh:285
void reserve(size_t _n)
Reserve memory for _n entries.
void enablePicking(bool _enable)
Enable or disable picking for this Node.
MaterialNode * materialNode()
get a pointer to the materialnode
unsigned int id() const
Definition: BaseNode.hh:423
MeshT * mesh_
pointer to the mesh
Definition: MeshObjectT.hh:155
ACG::SceneGraph::MeshNodeT< MeshT > * meshNode()
Get the Scenegraph Mesh Node.
bool contains(const UpdateType &_type) const
Check if this update contains the given UpdateType.
Definition: UpdateType.cc:99
virtual void update(UpdateType _type=UPDATE_ALL)
Update the whole Object (Selection,Topology,...)
ACG::SceneGraph::EnvMapNode * textureNode_
Scenegraph TextureNode.
Definition: MeshObjectT.hh:297
const UpdateType UPDATE_COLOR(UpdateTypeSet(1024))
Colors have changed.
ACG::SceneGraph::EnvMapNode * textureNode()
Get the TextureNode of the current mesh.
ACG::SceneGraph::SelectionNodeT< MeshT > * statusNode_
Status Node for a mesh, visualizing the selection state of a mesh.
Definition: MeshObjectT.hh:282
ACG::SceneGraph::StatusNodeT< MeshT, HandleNodeMod< MeshT > > * handleNode_
Handle selection Vis.
Definition: MeshObjectT.hh:288
void boundingBox(ACG::Vec3d &_bbMin, typename ACG::Vec3d &_bbMax)
Get the BoundingBox of this object.
ACG::Vec4f featureColor() const
get color for features. returns -1 vector, if handle node does not exists
void updateTopology()
Update Topology of all data structures.
void setFeatureColor(const ACG::Vec4f &_color)
set color for features
void setSelectionColor(const ACG::Vec4f &_color)
set color for selection
void setMainGLContext()
Set current GL Context to main context.
Hide this node, but draw children.
Definition: BaseNode.hh:394
bool pickingEnabled()
Check if picking is enabled for this Node.
void setDataType(DataType _type)
Definition: BaseObject.cc:233
StatusMode
Status modi.
Definition: BaseNode.hh:389
MeshObject(const MeshObject &_object)
copy constructor
OpenMeshTriangleBSPT< MeshT > OMTriangleBSP
If requested a bsp is created for this object.
Definition: MeshObjectT.hh:352
ACG::SceneGraph::ShaderNode ShaderNode
Simple Name for ShaderNode.
void updateModelingRegions()
Call this function to update the modeling regions.
void updateTopology()
set topology invalid (updates everything)
DataType dataType() const
Definition: BaseObject.cc:229
void setFromFileName(const QString &_filename)
Definition: BaseObject.cc:716
bool picked(uint _node_idx)
detect if the node has been picked
DLLEXPORT DataType typeId(QString _name)
Given a dataType Identifier string this function will return the id of the datatype.
Definition: Types.cc:139
VectorT< double, 3 > Vec3d
Definition: VectorT.hh:121
bool hasBsp() const
check if a BSP has been computed and is valid
ACG::SceneGraph::ShaderNode * shaderNode()
Return pointer to the shader node.