/*===========================================================================*\
* *
* OpenFlipper *
* Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen *
* www.openflipper.org *
* *
*--------------------------------------------------------------------------- *
* This file is part of OpenFlipper. *
* *
* 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 with the *
* following exceptions: *
* *
* If other files instantiate templates or use macros *
* or inline functions from this file, or you compile this file and *
* link it with other files to produce an executable, this file does *
* not by itself cause the resulting executable to be covered by the *
* GNU Lesser General Public License. This exception does not however *
* invalidate any other reasons why the executable file might be *
* covered by the GNU Lesser General Public License. *
* *
* 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 LesserGeneral Public *
* License along with OpenFlipper. If not, *
* see . *
* *
\*===========================================================================*/
/*===========================================================================*\
* *
* $Revision$ *
* $LastChangedBy$ *
* $Date$ *
* *
\*===========================================================================*/
//=============================================================================
//
// Types
//
//=============================================================================
/**
* \file Types.hh
* This File contains the basic available datatypes in the Framework.
*/
#ifndef MESHOBJECT_HH
#define MESHOBJECT_HH
//== INCLUDES =================================================================
// -------------------- OpenMesh
#include
#include
#include
#include
#include
#include
#include
#include
// -------------------- BSP
#include
#include
#include
//== TYPEDEFS =================================================================
/// Texture Node
typedef ACG::SceneGraph::TextureNode TextureNode;
//== CLASS DEFINITION =========================================================
/** This class provides the functionality for all kind of meshes for the framework
*/
template < class MeshT >
class DLLEXPORTONLY MeshObject : public BaseObjectData {
public:
/** \brief copy constructor
*
* Create a copy of this object
*/
MeshObject(const MeshObject& _object);
/** \brief Constructor
*
* This is the standard constructor for MeshObjects. As triangle and Poly Meshes are handled by this class, the
* typeId is passed to the MeshObject to specify it.
*
* @param _typeId This is the type Id the Object will use. Should be typeId("TriangleMesh") or typeId("PolyMesh")
*/
MeshObject(DataType _typeId);
/// destructor
virtual ~MeshObject();
/// Reset current object, including all related nodes.
virtual void cleanup();
protected:
/// Initialise current object, including all related nodes.
virtual void init( MeshT* _mesh = 0);
//===========================================================================
/** @name Name and Path handling
* @{ */
//===========================================================================
public:
/// Set the name of the Object
void setName( QString _name );
//===========================================================================
/** @name Content
* @{ */
//===========================================================================
public:
/// return a pointer to the mesh
MeshT* mesh();
/// Update the whole Object (Selection,Topology,...)
virtual void update(UpdateType _type = UPDATE_ALL);
/// Call this function to update the modeling regions
void updateSelection();
/// Call this function to update the modeling regions
void updateModelingRegions();
/// Update Feature Visualization Node
void updateFeatures();
/// Update Geometry of all data structures
void updateGeometry();
/// Update Colors of all data structures
void updateColor();
/// Update Topology of all data structures
void updateTopology();
/// Update Texture of all data structures
void updateTexture();
/** return a full copy of this object ( All scenegraph nodes will be created )
* but the object will not be a part of the object tree.
*/
BaseObject* copy();
private:
MeshT* mesh_;
/** @} */
//===========================================================================
/** @name Visualization
* @{ */
//===========================================================================
public:
/// Get the TextureNode of the current mesh
ACG::SceneGraph::EnvMapNode* textureNode();
/// Return pointer to the shader node
ACG::SceneGraph::ShaderNode* shaderNode();
/// Hide or show the selection Node of the object
void hideSelection( bool _hide );
/// return if the selections are currently visible
bool selectionVisible();
/// Hide or show the feature Node of the object
void hideFeatures( bool _hide );
/// return if the feature Node of the object is currently visible
bool featuresVisible( );
/// Hide or show the area Nodes of the object
void hideArea( StatusBits _bit, bool _hide );
/** \brief Return if the selected areas are currently visible
*
* \note If the bits contain multiple area bits, than only if all are visible,
* this function will return true
*
* @param _bit Status bit to check
* @return All visible?
*/
bool areaVisible( StatusBits _bit );
/// Get the Scenegraph Mesh Node
ACG::SceneGraph::MeshNodeT* meshNode();
/// Get the BoundingBox of this object
void boundingBox( ACG::Vec3d& _bbMin , typename ACG::Vec3d& _bbMax );
BaseNode* primaryNode();
private :
/// Status Node for a mesh, visualizing the selection state of a mesh
ACG::SceneGraph::SelectionNodeT* statusNode_;
/// Area selection Vis
ACG::SceneGraph::StatusNodeT > * areaNode_;
/// Handle selection Vis
ACG::SceneGraph::StatusNodeT > * handleNode_;
/// Feature selection Vis
ACG::SceneGraph::StatusNodeT > *featureNode_;
/// Scenegraph Mesh Node
ACG::SceneGraph::MeshNodeT* meshNode_;
/// Scenegraph TextureNode
ACG::SceneGraph::EnvMapNode* textureNode_;
/// Scenegraph ShaderNode
ACG::SceneGraph::ShaderNode* shaderNode_;
/** @} */
//===========================================================================
/** @name Load/Save
* @{ */
//===========================================================================
public:
/// Load a mesh from the given file
bool loadMesh(QString _filename);
/** @} */
//===========================================================================
/** @name Object Information
* @{ */
//===========================================================================
public:
/// Get all Info for the Object as a string
QString getObjectinfo();
/** @} */
//===========================================================================
/** @name Picking
* @{ */
//===========================================================================
public:
/// detect if the node has been picked
bool picked( uint _node_idx );
/// Enable or disable picking for this Node
void enablePicking( bool _enable );
/// Check if picking is enabled for this Node
bool pickingEnabled();
/** @} */
//===========================================================================
/** @name BSP Extension ( Implements a BSP for the mesh used for fast searches )
* @{ */
//===========================================================================
public:
typedef OpenMeshTriangleBSPT< MeshT > OMTriangleBSP;
/** Get a bsp for this object. Only supported for Triangle Meshes at the moment.
*
*
* @return Pointer to bsp or Null if unsupported for this type.
*/
OMTriangleBSP* requestTriangleBsp();
/** If something in the mesh changes, call this function to clear the octree.
* You have to do a new request as the old one will be deleted.
* @todo : Update the tree when the update function of this object is called.
* @todo : dont recreate but update the old one.
* @return The new pointer to the bsp or Null if unsupported
*/
void invalidateTriangleBsp();
/** Update the bsp for this object. Only supported for Triangle Meshes at the moment.
*
*
* @return Pointer to bsp or Null if unsupported for this type.
*/
OMTriangleBSP* resetTriangleBsp();
private :
/// If requested a bsp is created for this object
OMTriangleBSP* triangle_bsp_;
/** @} */
};
//=============================================================================
#if defined(INCLUDE_TEMPLATES) && !defined(MESHOBJECT_C)
#define MESHOBJECT_TEMPLATES
#include "MeshObjectT.cc"
#endif
//=============================================================================
#endif // MESHOBJECT_HH defined
//=============================================================================