Commit 5b8bfdcb authored by Jan Möbius's avatar Jan Möbius

Added functions to mesh node to toggle selectionVisibility

git-svn-id: http://www.openflipper.org/svnrepo/OpenFlipper/branches/Free@3001 383ad7c9-94d9-4d36-a494-682f7c89f535
parent 575129eb
...@@ -12,12 +12,12 @@ ...@@ -12,12 +12,12 @@
// it under the terms of the GNU Lesser General Public License as published by // 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 // the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version. // (at your option) any later version.
// //
// OpenFlipper is distributed in the hope that it will be useful, // OpenFlipper is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of // but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details. // GNU Lesser General Public License for more details.
// //
// You should have received a copy of the GNU Lesser General Public License // You should have received a copy of the GNU Lesser General Public License
// along with OpenFlipper. If not, see <http://www.gnu.org/licenses/>. // along with OpenFlipper. If not, see <http://www.gnu.org/licenses/>.
// //
...@@ -37,69 +37,69 @@ ...@@ -37,69 +37,69 @@
// MyTypes // MyTypes
// //
//============================================================================= //=============================================================================
#define MESHOBJECT_C #define MESHOBJECT_C
//== INCLUDES ================================================================= //== INCLUDES =================================================================
#include "Types.hh" #include "Types.hh"
#include <ACG/Scenegraph/DrawModes.hh> #include <ACG/Scenegraph/DrawModes.hh>
#include <OpenFlipper/common/GlobalOptions.hh> #include <OpenFlipper/common/GlobalOptions.hh>
//== TYPEDEFS ================================================================= //== TYPEDEFS =================================================================
//== CLASS DEFINITION ========================================================= //== CLASS DEFINITION =========================================================
/** Constructor for Mesh Objects. This object class gets a Separator Node giving /** Constructor for Mesh Objects. This object class gets a Separator Node giving
* the root node to which it should be connected. The mesh is generated internally * the root node to which it should be connected. The mesh is generated internally
* and all nodes for visualization will be added below the scenegraph node.\n * and all nodes for visualization will be added below the scenegraph node.\n
* You dont need to create an object of this type manually. Use * You dont need to create an object of this type manually. Use
* PluginFunctions::addTriMesh or PluginFunctions::addPolyMesh instead. The * PluginFunctions::addTriMesh or PluginFunctions::addPolyMesh instead. The
* objectDataType has to match the one of MeshT ( see Types.hh::DataType ) * objectDataType has to match the one of MeshT ( see Types.hh::DataType )
*/ */
template < class MeshT , DataType objectDataType > template < class MeshT , DataType objectDataType >
MeshObject< MeshT , objectDataType >::MeshObject( SeparatorNode* _rootNode ) : MeshObject< MeshT , objectDataType >::MeshObject( SeparatorNode* _rootNode ) :
BaseObjectData(_rootNode ), BaseObjectData(_rootNode ),
mesh_(0), mesh_(0),
statusNode_(0), statusNode_(0),
areaNode_(0), areaNode_(0),
handleNode_(0), handleNode_(0),
meshNode_(0), meshNode_(0),
textureNode_(0), textureNode_(0),
shaderNode_(0), shaderNode_(0),
triangle_bsp_(0) triangle_bsp_(0)
{ {
setDataType(objectDataType); setDataType(objectDataType);
init(); init();
} }
/** Destructor for Mesh Objects. The destructor deletes the mesh and all /** Destructor for Mesh Objects. The destructor deletes the mesh and all
* Scenegraph nodes associated with the mesh or the object. * Scenegraph nodes associated with the mesh or the object.
*/ */
template < class MeshT , DataType objectDataType > template < class MeshT , DataType objectDataType >
MeshObject< MeshT , objectDataType >::~MeshObject() MeshObject< MeshT , objectDataType >::~MeshObject()
{ {
// Delete the data attached to this object ( this will remove all perObject data) // Delete the data attached to this object ( this will remove all perObject data)
// Not the best way to do it but it will work. // Not the best way to do it but it will work.
// This is only necessary if people use references to the mesh below and // This is only necessary if people use references to the mesh below and
// they do something with the mesh in the destructor of their // they do something with the mesh in the destructor of their
// perObjectData. // perObjectData.
deleteData(); deleteData();
// Delete the Mesh only, if this object contains a mesh // Delete the Mesh only, if this object contains a mesh
if ( mesh_ != NULL) { if ( mesh_ != NULL) {
delete mesh_; delete mesh_;
mesh_ = NULL; mesh_ = NULL;
} else { } else {
std::cerr << "Destructor error : Mesh already deleted" << std::endl; std::cerr << "Destructor error : Mesh already deleted" << std::endl;
} }
if ( triangle_bsp_ != 0 ) if ( triangle_bsp_ != 0 )
delete triangle_bsp_; delete triangle_bsp_;
triangle_bsp_ = 0; triangle_bsp_ = 0;
// No need to delete the scenegraph Nodes as this will be managed by baseplugin // No need to delete the scenegraph Nodes as this will be managed by baseplugin
areaNode_ = 0; areaNode_ = 0;
handleNode_ = 0; handleNode_ = 0;
...@@ -107,46 +107,46 @@ ...@@ -107,46 +107,46 @@
textureNode_ = 0; textureNode_ = 0;
shaderNode_ = 0; shaderNode_ = 0;
} }
/** Cleanup Function for Mesh Objects. Deletes the contents of the whole object and /** Cleanup Function for Mesh Objects. Deletes the contents of the whole object and
* calls MeshObject::init afterwards. * calls MeshObject::init afterwards.
*/ */
template < class MeshT , DataType objectDataType > template < class MeshT , DataType objectDataType >
void MeshObject< MeshT , objectDataType >::cleanup() { void MeshObject< MeshT , objectDataType >::cleanup() {
// Delete the Mesh only, if this object contains a mesh // Delete the Mesh only, if this object contains a mesh
if ( mesh_ != NULL) { if ( mesh_ != NULL) {
delete mesh_; delete mesh_;
mesh_ = NULL; mesh_ = NULL;
} else { } else {
std::cerr << "Cleanup error : Triangle Mesh already deleted" << std::endl; std::cerr << "Cleanup error : Triangle Mesh already deleted" << std::endl;
} }
if ( triangle_bsp_ != 0 ) if ( triangle_bsp_ != 0 )
delete triangle_bsp_; delete triangle_bsp_;
triangle_bsp_ = 0; triangle_bsp_ = 0;
BaseObjectData::cleanup(); BaseObjectData::cleanup();
statusNode_ = 0; statusNode_ = 0;
areaNode_ = 0; areaNode_ = 0;
handleNode_ = 0; handleNode_ = 0;
textureNode_= 0; textureNode_= 0;
shaderNode_ = 0; shaderNode_ = 0;
meshNode_ = 0; meshNode_ = 0;
setDataType(objectDataType); setDataType(objectDataType);
init(); init();
} }
/** This function initalizes the mesh object. It creates the scenegraph nodes, /** This function initalizes the mesh object. It creates the scenegraph nodes,
* the mesh and requests all required properties for the mesh. * the mesh and requests all required properties for the mesh.
*/ */
template < class MeshT , DataType objectDataType > template < class MeshT , DataType objectDataType >
void MeshObject< MeshT , objectDataType >::init() { void MeshObject< MeshT , objectDataType >::init() {
mesh_ = new MeshT(); mesh_ = new MeshT();
mesh_->request_vertex_normals(); mesh_->request_vertex_normals();
mesh_->request_face_normals(); mesh_->request_face_normals();
mesh_->request_vertex_status(); mesh_->request_vertex_status();
...@@ -155,123 +155,123 @@ ...@@ -155,123 +155,123 @@
mesh_->request_edge_status(); mesh_->request_edge_status();
mesh_->request_vertex_colors(); mesh_->request_vertex_colors();
mesh_->request_face_colors(); mesh_->request_face_colors();
mesh_->request_vertex_texcoords2D(); mesh_->request_vertex_texcoords2D();
mesh_->request_halfedge_texcoords2D(); mesh_->request_halfedge_texcoords2D();
if ( manipulatorNode() == NULL) if ( manipulatorNode() == NULL)
std::cerr << "Error when creating Mesh Object! manipulatorNode is NULL!" << std::endl; std::cerr << "Error when creating Mesh Object! manipulatorNode is NULL!" << std::endl;
statusNode_ = new ACG::SceneGraph::SelectionNodeT<MeshT>(*mesh_,manipulatorNode(),"NEW StatusNode for mesh " ); statusNode_ = new ACG::SceneGraph::SelectionNodeT<MeshT>(*mesh_,manipulatorNode(),"NEW StatusNode for mesh " );
statusNode_->set_point_size(4.0); statusNode_->set_point_size(4.0);
statusNode_->set_color(ACG::Vec4f(1.0,0.0,0.0,1.0)); statusNode_->set_color(ACG::Vec4f(1.0,0.0,0.0,1.0));
areaNode_ = new ACG::SceneGraph::StatusNodeT<MeshT, AreaNodeMod<MeshT> >(*mesh_, manipulatorNode(), "NEW AreaNode for mesh "); areaNode_ = new ACG::SceneGraph::StatusNodeT<MeshT, AreaNodeMod<MeshT> >(*mesh_, manipulatorNode(), "NEW AreaNode for mesh ");
areaNode_->set_round_points(true); areaNode_->set_round_points(true);
areaNode_->enable_alpha_test(0.5); areaNode_->enable_alpha_test(0.5);
areaNode_->set_point_size(7.0); areaNode_->set_point_size(7.0);
areaNode_->set_color(ACG::Vec4f(0.4, 0.4, 1.0, 1.0)); areaNode_->set_color(ACG::Vec4f(0.4, 0.4, 1.0, 1.0));
handleNode_ = new ACG::SceneGraph::StatusNodeT<MeshT, HandleNodeMod<MeshT> >(*mesh_, manipulatorNode(), "NEW HandleNode for mesh "); handleNode_ = new ACG::SceneGraph::StatusNodeT<MeshT, HandleNodeMod<MeshT> >(*mesh_, manipulatorNode(), "NEW HandleNode for mesh ");
handleNode_->set_round_points(true); handleNode_->set_round_points(true);
handleNode_->enable_alpha_test(0.5); handleNode_->enable_alpha_test(0.5);
handleNode_->set_line_width(2.0); handleNode_->set_line_width(2.0);
handleNode_->set_point_size(7.0); handleNode_->set_point_size(7.0);
handleNode_->set_color(ACG::Vec4f(0.2, 1.0, 0.2, 1.0)); handleNode_->set_color(ACG::Vec4f(0.2, 1.0, 0.2, 1.0));
if ( materialNode() == NULL) if ( materialNode() == NULL)
std::cerr << "Error when creating Mesh Object! materialNode is NULL!" << std::endl; std::cerr << "Error when creating Mesh Object! materialNode is NULL!" << std::endl;
textureNode_ = new TextureNode(materialNode(),"NEW TextureNode for "); textureNode_ = new TextureNode(materialNode(),"NEW TextureNode for ");
shaderNode_ = new ACG::SceneGraph::ShaderNode(textureNode() , "NEW ShaderNode for "); shaderNode_ = new ACG::SceneGraph::ShaderNode(textureNode() , "NEW ShaderNode for ");
meshNode_ = new ACG::SceneGraph::MeshNodeT<MeshT>(*mesh_, shaderNode_, "NEW MeshNode"); meshNode_ = new ACG::SceneGraph::MeshNodeT<MeshT>(*mesh_, shaderNode_, "NEW MeshNode");
QString shaderDir = OpenFlipper::Options::shaderDirStr() + QString shaderDir = OpenFlipper::Options::shaderDirStr() +
OpenFlipper::Options::dirSeparator(); OpenFlipper::Options::dirSeparator();
std::string shaderDirectory = std::string( shaderDir.toUtf8() ); std::string shaderDirectory = std::string( shaderDir.toUtf8() );
shaderNode_->setShaderDir( shaderDirectory ); shaderNode_->setShaderDir( shaderDirectory );
if ( QFile( shaderDir + "Phong/Vertex.glsl").exists() && QFile( shaderDir + "Phong/Fragment.glsl" ).exists() ) { if ( QFile( shaderDir + "Phong/Vertex.glsl").exists() && QFile( shaderDir + "Phong/Fragment.glsl" ).exists() ) {
shaderNode_->setShader(ACG::SceneGraph::DrawModes::SOLID_PHONG_SHADED, shaderNode_->setShader(ACG::SceneGraph::DrawModes::SOLID_PHONG_SHADED,
"Phong/Vertex.glsl" , "Phong/Vertex.glsl" ,
"Phong/Fragment.glsl" ); "Phong/Fragment.glsl" );
} else } else
std::cerr << "Shader Files for Phong not found!" << std::endl; std::cerr << "Shader Files for Phong not found!" << std::endl;
if ( QFile( shaderDir + "Ward/Vertex.glsl").exists() && QFile( shaderDir + "Ward/Fragment.glsl" ).exists() ) { if ( QFile( shaderDir + "Ward/Vertex.glsl").exists() && QFile( shaderDir + "Ward/Fragment.glsl" ).exists() ) {
shaderNode_->setShader(ACG::SceneGraph::DrawModes::SOLID_SHADER, shaderNode_->setShader(ACG::SceneGraph::DrawModes::SOLID_SHADER,
"Ward/Vertex.glsl" , "Ward/Vertex.glsl" ,
"Ward/Fragment.glsl" ); "Ward/Fragment.glsl" );
// Ward shader uses 3 parameters so activate shader, set params and deactivate it again // Ward shader uses 3 parameters so activate shader, set params and deactivate it again
GLSL::PtrProgram shader = shaderNode_->getShader( ACG::SceneGraph::DrawModes::SOLID_SHADER ); GLSL::PtrProgram shader = shaderNode_->getShader( ACG::SceneGraph::DrawModes::SOLID_SHADER );
if ( shader == 0 ) { if ( shader == 0 ) {
std::cerr << "Unable to get shader for shader mode" << std::endl; std::cerr << "Unable to get shader for shader mode" << std::endl;
} else { } else {
shader->use(); shader->use();
shader->setUniform("ward_specular" , 0.5f); shader->setUniform("ward_specular" , 0.5f);
shader->setUniform("ward_diffuse" , 1.0f); shader->setUniform("ward_diffuse" , 1.0f);
shader->setUniform("ward_alpha" , 0.1f); shader->setUniform("ward_alpha" , 0.1f);
shader->disable(); shader->disable();
} }
} else } else
std::cerr << "Shader Files for Ward not found!!" << std::endl; std::cerr << "Shader Files for Ward not found!!" << std::endl;
// Update all nodes // Update all nodes
update(); update();
} }
// =============================================================================== // ===============================================================================
// Name/Path Handling // Name/Path Handling
// =============================================================================== // ===============================================================================
/** Set the name of an object. All Scenegraph nodes are renamed too. It also calls /** Set the name of an object. All Scenegraph nodes are renamed too. It also calls
* BaseObjectData::setName. * BaseObjectData::setName.
*/ */
template < class MeshT , DataType objectDataType > template < class MeshT , DataType objectDataType >
void MeshObject< MeshT , objectDataType >::setName( QString _name ) { void MeshObject< MeshT , objectDataType >::setName( QString _name ) {
BaseObjectData::setName(_name); BaseObjectData::setName(_name);
std::string nodename = std::string("StatusNode for mesh " + _name.toUtf8() ); std::string nodename = std::string("StatusNode for mesh " + _name.toUtf8() );
statusNode_->name( nodename ); statusNode_->name( nodename );
nodename = std::string("AreaNode for mesh " + _name.toUtf8() ); nodename = std::string("AreaNode for mesh " + _name.toUtf8() );
areaNode_->name( nodename ); areaNode_->name( nodename );
nodename = std::string("HandleNode for mesh " + _name.toUtf8() ); nodename = std::string("HandleNode for mesh " + _name.toUtf8() );
handleNode_->name( nodename ); handleNode_->name( nodename );
nodename = std::string("TextureNode for mesh "+ _name.toUtf8() ); nodename = std::string("TextureNode for mesh "+ _name.toUtf8() );
textureNode_->name( nodename ); textureNode_->name( nodename );
nodename = std::string("ShaderNode for mesh "+ _name.toUtf8() ); nodename = std::string("ShaderNode for mesh "+ _name.toUtf8() );
shaderNode_->name( nodename ); shaderNode_->name( nodename );
nodename = std::string("MeshNode for mesh " + _name.toUtf8() ); nodename = std::string("MeshNode for mesh " + _name.toUtf8() );
meshNode_->name( nodename ); meshNode_->name( nodename );
} }
// =============================================================================== // ===============================================================================
// Content // Content
// =============================================================================== // ===============================================================================
/** Get a pointer to the objects mesh. /** Get a pointer to the objects mesh.
* @return Pointer to the mesh * @return Pointer to the mesh
*/ */
template < class MeshT , DataType objectDataType > template < class MeshT , DataType objectDataType >
MeshT* MeshObject< MeshT , objectDataType >::mesh() { MeshT* MeshObject< MeshT , objectDataType >::mesh() {
return mesh_; return mesh_;
} }
/** Updates the visualization of the object. Calls MeshObject::updateGeometry, /** Updates the visualization of the object. Calls MeshObject::updateGeometry,
* MeshObject::updateTopology, MeshObject::updateSelection and * MeshObject::updateTopology, MeshObject::updateSelection and
* MeshObject::updateModelingRegions. * MeshObject::updateModelingRegions.
*/ */
template < class MeshT , DataType objectDataType > template < class MeshT , DataType objectDataType >
...@@ -281,32 +281,32 @@ ...@@ -281,32 +281,32 @@
updateSelection(); updateSelection();
updateModelingRegions(); updateModelingRegions();
} }
/** Updates the selection scenegraph nodes */ /** Updates the selection scenegraph nodes */
template < class MeshT , DataType objectDataType > template < class MeshT , DataType objectDataType >
void MeshObject< MeshT , objectDataType >::updateSelection() { void MeshObject< MeshT , objectDataType >::updateSelection() {
statusNode_->update_cache(); statusNode_->update_cache();
} }
/** Updates the geometry information in the mesh scenegraph node */ /** Updates the geometry information in the mesh scenegraph node */
template < class MeshT , DataType objectDataType > template < class MeshT , DataType objectDataType >
void MeshObject< MeshT , objectDataType >::updateGeometry() { void MeshObject< MeshT , objectDataType >::updateGeometry() {
meshNode_->update_geometry(); meshNode_->update_geometry();
} }
/** Updates the topology information in the mesh scenegraph node */ /** Updates the topology information in the mesh scenegraph node */
template < class MeshT , DataType objectDataType > template < class MeshT , DataType objectDataType >
void MeshObject< MeshT , objectDataType >::updateTopology() { void MeshObject< MeshT , objectDataType >::updateTopology() {
meshNode_->update_topology(); meshNode_->update_topology();
} }
/** Updates the modeling regions scenegraph nodes */ /** Updates the modeling regions scenegraph nodes */
template < class MeshT , DataType objectDataType > template < class MeshT , DataType objectDataType >
void MeshObject< MeshT , objectDataType >::updateModelingRegions() { void MeshObject< MeshT , objectDataType >::updateModelingRegions() {
areaNode_->update_cache(); areaNode_->update_cache();
handleNode_->update_cache(); handleNode_->update_cache();
} }
// =============================================================================== // ===============================================================================
// Visualization // Visualization
// =============================================================================== // ===============================================================================
...@@ -317,7 +317,7 @@ ...@@ -317,7 +317,7 @@
TextureNode* MeshObject< MeshT , objectDataType >::textureNode() { TextureNode* MeshObject< MeshT , objectDataType >::textureNode() {
return textureNode_; return textureNode_;
} }
/** Returns a pointer to the shader node /** Returns a pointer to the shader node
* @return Pointer to the shader node * @return Pointer to the shader node
*/ */
...@@ -325,22 +325,58 @@ ...@@ -325,22 +325,58 @@
ACG::SceneGraph::ShaderNode* MeshObject< MeshT , objectDataType >::shaderNode() { ACG::SceneGraph::ShaderNode* MeshObject< MeshT , objectDataType >::shaderNode() {
return shaderNode_; return shaderNode_;
} }
/** Shows or hides the selections on the object
*/
template < class MeshT , DataType objectDataType >
void MeshObject< MeshT , objectDataType >::hideSelection( bool _hide ) {
if ( _hide ) {
statusNode_->set_status( ACG::SceneGraph::BaseNode::HideNode );
} else {
statusNode_->set_status( ACG::SceneGraph::BaseNode::Active );
}
}
/** Shows or hides the areas on the object
*/
template < class MeshT , DataType objectDataType >
void MeshObject< MeshT , objectDataType >::hideAreaNodes( bool _hide ) {
if ( _hide ) {
areaNode_->set_status( ACG::SceneGraph::BaseNode::HideNode );
handleNode_->set_status( ACG::SceneGraph::BaseNode::HideNode );
} else {
areaNode_->set_status( ACG::SceneGraph::BaseNode::Active );
handleNode_->set_status( ACG::SceneGraph::BaseNode::Active );
}
}
template < class MeshT , DataType objectDataType >
bool MeshObject< MeshT , objectDataType >::selectionVisible() {
return ( statusNode_->status() == ACG::SceneGraph::BaseNode::Active );
}
template < class MeshT , DataType objectDataType >
bool MeshObject< MeshT , objectDataType >::areasVisible() {
return ( areaNode_->status() == ACG::SceneGraph::BaseNode::Active );
}
/** Returns a pointer to the mesh node /** Returns a pointer to the mesh node
* @return Pointer to the mesh node * @return Pointer to the mesh node
*/ */
template < class MeshT , DataType objectDataType > template < class MeshT , DataType objectDataType >
ACG::SceneGraph::MeshNodeT<MeshT>* MeshObject< MeshT , objectDataType >::meshNode() { ACG::SceneGraph::MeshNodeT<MeshT>* MeshObject< MeshT , objectDataType >::meshNode() {
return meshNode_; return meshNode_;
} }
/** Get the Bounding box size of this object /** Get the Bounding box size of this object
*/ */
template < class MeshT , DataType objectDataType > template < class MeshT , DataType objectDataType >
void MeshObject< MeshT , objectDataType >::boundingBox( ACG::Vec3f& _bbMin , ACG::Vec3f& _bbMax ) { void MeshObject< MeshT , objectDataType >::boundingBox( ACG::Vec3f& _bbMin , ACG::Vec3f& _bbMax ) {
meshNode_->boundingBox(_bbMin,_bbMax); meshNode_->boundingBox(_bbMin,_bbMax);
} }
/** Add a texture to the object. /** Add a texture to the object.
* @param _property Name of the mesh property handle containing the texture. * @param _property Name of the mesh property handle containing the texture.
* @param _textureFile Name of the texturefile used (has to be in the Textures dir of OpenFlipper) * @param _textureFile Name of the texturefile used (has to be in the Textures dir of OpenFlipper)
...@@ -350,84 +386,84 @@ ...@@ -350,84 +386,84 @@
{ {
textures.push_back( std::pair<QString,QString>(_property,_textureFile) ); textures.push_back( std::pair<QString,QString>(_property,_textureFile) );
} }
// =============================================================================== // ===============================================================================
// Load/Save // Load/Save
// =============================================================================== // ===============================================================================
/** Load the mesh data from a file. The loader uses the OpenMesh object loaders and /** Load the mesh data from a file. The loader uses the OpenMesh object loaders and
* therefore supports all mesh types supported by OpenMesh. * therefore supports all mesh types supported by OpenMesh.
* *
* @param _filename Full path of the file to load. * @param _filename Full path of the file to load.
*/ */
template < class MeshT , DataType objectDataType > template < class MeshT , DataType objectDataType >
bool MeshObject< MeshT , objectDataType >::loadMesh(QString _filename) { bool MeshObject< MeshT , objectDataType >::loadMesh(QString _filename) {
setFromFileName(_filename); setFromFileName(_filename);
// call the local function to update names // call the local function to update names
setName( name() ); setName( name() );
std::string filename = std::string( _filename.toUtf8() ); std::string filename = std::string( _filename.toUtf8() );