45#include "SubdividerPlugin.hh"
57SubdividerPlugin::SubdividerPlugin() :
64SubdividerPlugin::~SubdividerPlugin()
70void SubdividerPlugin::initializePlugin()
72 if ( OpenFlipper::Options::gui() ) {
77 connect(
tool_->subdivide_uniform_toolButton, SIGNAL( clicked() ),
this, SLOT( slotSubdivideUniformButton() ) );
78 connect(
tool_->simpleButton, SIGNAL( clicked() ),
this, SLOT( slotSimpleSubdivideButton() ) );
82 toolIcon_ =
new QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+
"subdivider.png");
83 emit addToolbox( tr(
"Subdivider") ,
tool_, toolIcon_ );
87void SubdividerPlugin::pluginsInitialized()
89 emit setSlotDescription(
"subdivide(int,QString,int,bool)",
"Subdivide a triangular or polygonal mesh. For polygonal meshes use catmullClark, the other algorithms are for triangular meshes.",
90 QString(
"object_id,algorithm,iterations,update_points").split(
","),
91 QString(
" id of an object, algorithm to use ( loop | sqrt3 | interpolating_sqrt3 | modifiedButterfly | catmullClark ), number of iterations, update original points").split(
","));
93 emit setSlotDescription(
"subdivide(int,QString,int)",
"Subdivide a triangular or polygonal mesh. For polygonal meshes use catmullClark, the other algorithms are for triangular meshes. This function will modify the original point locations.",
94 QString(
"object_id,algorithm,iterations").split(
","),
95 QString(
" id of an object, algorithm to use ( loop | sqrt3 | interpolating_sqrt3 | modifiedButterfly | catmullClark ), number of iterations").split(
","));
97 emit setSlotDescription(
"simpleSubdivide(int,QString,int,double,bool)",
"Subdivide a triangular mesh.",
98 QString(
"object_id,algorithm,iterations,parameter,update_points").split(
","),
99 QString(
" id of an object, algorithm to use ( longest ), number of iterations, additional parameter(e.g. maximal edge length for longest), update original points").split(
","));
101 emit setSlotDescription(
"simpleSubdivide(int,QString,int,double)",
"Subdivide a triangular mesh. This function will modify the original point locations.",
102 QString(
"object_id,algorithm,iterations,parameter").split(
","),
103 QString(
" id of an object, algorithm to use ( longest ), number of iterations, additional parameter(e.g. maximal edge length for longest)").split(
","));
108void SubdividerPlugin::slotSubdivideUniformButton()
110 std::vector< int > ids;
114 for (
unsigned int i = 0; i < ids.size(); ++i)
116 if(
tool_->loop_radioButton->isChecked())
118 subdivide(ids[i],
"loop",
tool_->subdivision_steps_spinBox->value(),
tool_->updatePoints->isChecked());
120 else if (
tool_->sqrt3_radioButton->isChecked() )
122 subdivide(ids[i],
"sqrt3",
tool_->subdivision_steps_spinBox->value(),
tool_->updatePoints->isChecked());
124 else if (
tool_->LabsikGreiner_radioButton->isChecked() )
126 subdivide(ids[i],
"interpolating_sqrt3",
tool_->subdivision_steps_spinBox->value(),
tool_->updatePoints->isChecked());
128 else if (
tool_->modifiedButterfly_radioButton->isChecked() )
130 subdivide(ids[i],
"modifiedButterfly",
tool_->subdivision_steps_spinBox->value(),
tool_->updatePoints->isChecked());
132 else if (
tool_->catmullClark_radioButton->isChecked() )
134 subdivide(ids[i],
"catmullClark",
tool_->subdivision_steps_spinBox->value(),
tool_->updatePoints->isChecked());
147void SubdividerPlugin::slotSimpleSubdivideButton()
149 std::vector< int > ids;
152 for (
unsigned int i = 0; i < ids.size(); ++i)
154 if(
tool_->longestEdgeSplit->isChecked())
157 tool_->maximalEdgeLength->value(),
tool_->updatePoints->isChecked());
172 if (!test_trimesh_object(_objectId,
object)) {
173 emit log(
LOGERR,
"The simple subdivision algorithms only work on triangular meshes.");
179 if (_algorithm.contains(
"longest", Qt::CaseInsensitive)) {
183 subdivider.set_max_edge_length(_parameter);
184 subdivider(*mesh, _steps, _update_points);
187 emit log(
LOGERR,
"Unsupported algorithm in simpleSubdivide: " + _algorithm);
191 mesh->garbage_collection();
208 emit log(
LOGERR,
"Unable to get Object in SubdividerPlugin::subdivide");
214 if ( _algorithm.contains(
"catmullClark",Qt::CaseInsensitive) ) {
218 emit log(
LOGERR,
"Error: Catmull Clark only works on Poly Meshes!");
224 subdivider.
attach(*polyMesh);
225 subdivider(_steps,_update_points);
228 polyMesh->garbage_collection();
230 polyMesh->update_face_normals();
231 polyMesh->update_vertex_normals();
245 emit log(
LOGERR,
"Error: Unable to get triangular mesh in subdivider!");
249 if(_algorithm.contains(
"loop",Qt::CaseInsensitive))
254 subdivider(*mesh,_steps,_update_points);
257 else if ( _algorithm.contains(
"sqrt3",Qt::CaseInsensitive) )
262 subdivider(_steps,_update_points);
265 else if ( _algorithm.contains(
"interpolating_sqrt(3)",Qt::CaseInsensitive) )
270 subdivider(_steps,_update_points);
273 else if ( _algorithm.contains(
"modifiedButterfly",Qt::CaseInsensitive) )
278 subdivider(_steps,_update_points);
281 emit log(
LOGERR,
"Unsupported or unknown subdivider for triangular meshes: " + _algorithm);
284 mesh->garbage_collection();
301bool SubdividerPlugin::test_trimesh_object(
int _identifier,
BaseObjectData*& _object)
303 if ( _identifier == -1)
#define DATA_TRIANGLE_MESH
bool dataType(DataType _type) const
void update_face_normals()
Update normal vectors for all faces.
void update_vertex_normals()
Update normal vectors for all vertices.
void subdivide(int _objectId, QString _algorithm, int _steps, bool _update_points=true)
Scripting slot for subdivision.
void simpleSubdivide(int _objectId, QString _algorithm, int _steps, double _parameter, bool _update_points=true)
Scripting slot for the simple subdivision algorithms.
subdividerToolbarWidget * tool_
Widget for Toolbox.
const UpdateType UPDATE_TOPOLOGY(UpdateTypeSet(8))
Topology updated.
bool getObject(const int _identifier, BaseObject *&_object)
Get the object which has the given identifier.
TriMesh * triMesh(BaseObjectData *_object)
Get a triangle mesh from an object.
PolyMesh * polyMesh(BaseObjectData *_object)
Get a poly mesh from an object.
bool getTargetIdentifiers(std::vector< int > &_identifiers)
Get the identifiers of all objects marked as a target object.