diff --git a/SubdividerPlugin.cc b/SubdividerPlugin.cc index 06c251bc2094fcf1c832ef370e1cbf41e193511c..9dd5a2a5f4b7eac9f2c289670d17d99f974a7a86 100644 --- a/SubdividerPlugin.cc +++ b/SubdividerPlugin.cc @@ -59,6 +59,8 @@ #include #include +#include + SubdividerPlugin::SubdividerPlugin() : tool_(0), @@ -89,7 +91,7 @@ void SubdividerPlugin::pluginsInitialized() { emit setSlotDescription("subdivide(int,QString,int)", "Smooth a triangular mesh", QString("object_id,algorithm,iterations").split(","), - QString("id of an object, algorithm to use (linear | loop | sqrt3 | interpolating_sqrt3 | modifiedButterfly ), number of iterations").split(",")); + QString("id of an object, algorithm to use (linear | loop | sqrt3 | interpolating_sqrt3 | modifiedButterfly | catmullClark ), number of iterations").split(",")); } //----------------------------------------------------------------------------- @@ -117,6 +119,10 @@ void SubdividerPlugin::slotSubdivideUniform() { subdivide(ids[i],"modifiedButterfly",tool_->subdivision_steps_spinBox->value()); } + else if ( tool_->catmullClark_radioButton->isChecked() ) + { + subdivide(ids[i],"catmullClark",tool_->subdivision_steps_spinBox->value()); + } } } emit updateView(); @@ -178,51 +184,90 @@ void SubdividerPlugin::simpleSubdivide(int _objectId, QString _algorithm , int _ void SubdividerPlugin::subdivide(int _objectId, QString _algorithm , int _steps) { BaseObjectData* object; - if(!test_trimesh_object(_objectId , object)) + PluginFunctions::getObject(_objectId,object); + if(!object) { + emit log(LOGERR,"Unable to get Object in SubdividerPlugin::subdivide"); return; + } - TriMesh* mesh = PluginFunctions::triMesh(object); + TriMesh* mesh = PluginFunctions::triMesh(object); + PolyMesh* polyMesh = PluginFunctions::polyMesh(object); - if(_algorithm.contains("loop",Qt::CaseInsensitive)) - { - OpenMesh::Subdivider::Uniform::LoopT subdivider; - - subdivider.attach(*mesh); - subdivider(*mesh,_steps,tool_->updatePoints->isChecked()); - subdivider.detach(); - } - else if ( _algorithm.contains("sqrt3",Qt::CaseInsensitive) ) - { - OpenMesh::Subdivider::Uniform::Sqrt3T subdivider; - - subdivider.attach(*mesh); - subdivider(_steps,tool_->updatePoints->isChecked()); - subdivider.detach(); - } - else if ( _algorithm.contains("interpolating_sqrt(3)",Qt::CaseInsensitive) ) - { - OpenMesh::Subdivider::Uniform::InterpolatingSqrt3LGT subdivider; - - subdivider.attach(*mesh); - subdivider(_steps,tool_->updatePoints->isChecked()); - subdivider.detach(); - } - else if ( _algorithm.contains("modifiedButterfly",Qt::CaseInsensitive) ) - { - OpenMesh::Subdivider::Uniform::ModifiedButterflyT subdivider; - - subdivider.attach(*mesh); - subdivider(_steps,tool_->updatePoints->isChecked()); - subdivider.detach(); + if ( mesh ) { + if(_algorithm.contains("loop",Qt::CaseInsensitive)) + { + OpenMesh::Subdivider::Uniform::LoopT subdivider; + + subdivider.attach(*mesh); + subdivider(*mesh,_steps,tool_->updatePoints->isChecked()); + subdivider.detach(); + } + else if ( _algorithm.contains("sqrt3",Qt::CaseInsensitive) ) + { + OpenMesh::Subdivider::Uniform::Sqrt3T subdivider; + + subdivider.attach(*mesh); + subdivider(_steps,tool_->updatePoints->isChecked()); + subdivider.detach(); + } + else if ( _algorithm.contains("interpolating_sqrt(3)",Qt::CaseInsensitive) ) + { + OpenMesh::Subdivider::Uniform::InterpolatingSqrt3LGT subdivider; + + subdivider.attach(*mesh); + subdivider(_steps,tool_->updatePoints->isChecked()); + subdivider.detach(); + } + else if ( _algorithm.contains("modifiedButterfly",Qt::CaseInsensitive) ) + { + OpenMesh::Subdivider::Uniform::ModifiedButterflyT subdivider; + + subdivider.attach(*mesh); + subdivider(_steps,tool_->updatePoints->isChecked()); + subdivider.detach(); + } else { + emit log(LOGERR,"Unsupported or unknown subdivider for triangular meshes: " + _algorithm); + } + + mesh->garbage_collection(); + + mesh->update_face_normals(); + mesh->update_vertex_normals(); + //TriMeshObject* tmo = PluginFunctions::triMeshObject(object); + //tmo->update(); } - mesh->garbage_collection(); + if ( polyMesh ) { - mesh->update_face_normals(); - mesh->update_vertex_normals(); - TriMeshObject* tmo = PluginFunctions::triMeshObject(object); - tmo->update(); + if ( _algorithm.contains("catmullClark",Qt::CaseInsensitive) ) + { + + PolyMesh* polyMesh = PluginFunctions::polyMesh(object); + + if ( ! polyMesh) { + emit log(LOGERR,"Error: Catmull Clark only works on Poly Meshes!"); + return; + } + + OpenMesh::Subdivider::Uniform::CatmullClarkT subdivider; + + subdivider.attach(*polyMesh); + subdivider(_steps,tool_->updatePoints->isChecked()); + subdivider.detach(); + + polyMesh->garbage_collection(); + + polyMesh->update_face_normals(); + polyMesh->update_vertex_normals(); + //PolyMeshObject* pmo = PluginFunctions::polyMeshObject(object); + //pmo->update(); + + } else { + emit log(LOGERR,"Unsupported or unknown subdivider for polygonal meshes: " + _algorithm); + } + + } // Create backup emit createBackup(object->id(), "Subdivider", UPDATE_TOPOLOGY); diff --git a/SubdividerPlugin.hh b/SubdividerPlugin.hh index 1acfab854ed66ae4097fd93e6526e3e619284c9b..e7fd6583f7ff7e8944e3cae652b3c9d14bc32518 100644 --- a/SubdividerPlugin.hh +++ b/SubdividerPlugin.hh @@ -56,6 +56,7 @@ #include #include #include +#include #include "subdividerToolbar.hh" diff --git a/subdividerControls.ui b/subdividerControls.ui index c799a024c862fab843ef87e363adb0ef281ca975..c765566cd5f63ed9c4cf7c3c2adbb75f592bfc32 100644 --- a/subdividerControls.ui +++ b/subdividerControls.ui @@ -109,6 +109,16 @@ of SIGGRAPH 1996, ACM SIGGRAPH, 1996, pp. 189-192. + + + + <html><head/><body><p>Catmull Clark subdivision</p><p><br/></p><p><span style=" font-weight:600;">Note: Only works on quadrangular meshes!</span></p></body></html> + + + Catmull Clark + + +