From 3fddf93c97b072e12a3ea17d8eb5df107197de89 Mon Sep 17 00:00:00 2001 From: Guido Ranzuglia granzuglia Date: Sat, 9 Aug 2014 09:37:50 +0000 Subject: [PATCH] edit_pickpoints plugin: - added support for mesh with double precision attributes - removed some warnings --- .../edit_pickpoints/editpickpoints.cpp | 40 +++++------- .../edit_pickpoints/editpickpoints.h | 2 +- .../edit_pickpoints/pickedPoints.cpp | 52 ++++++++------- .../edit_pickpoints/pickedPoints.h | 14 ++-- .../edit_pickpoints/pickpointsDialog.cpp | 64 +++++++++---------- .../edit_pickpoints/pickpointsDialog.h | 26 ++++---- 6 files changed, 97 insertions(+), 101 deletions(-) diff --git a/src/meshlabplugins/edit_pickpoints/editpickpoints.cpp b/src/meshlabplugins/edit_pickpoints/editpickpoints.cpp index 4de8f804a..d79b14f1d 100644 --- a/src/meshlabplugins/edit_pickpoints/editpickpoints.cpp +++ b/src/meshlabplugins/edit_pickpoints/editpickpoints.cpp @@ -87,8 +87,8 @@ void EditPickPointsPlugin::Decorate(MeshModel &mm, GLArea *gla, QPainter *painte } //We have to calculate the position here because it doesnt work in the mouseEvent functions for some reason - Point3f pickedPoint; - if (moveSelectPoint && Pick(currentMousePosition.x(),gla->height()-currentMousePosition.y(),pickedPoint)){ + Point3m pickedPoint; + if (moveSelectPoint && Pick(currentMousePosition.x(),gla->height()-currentMousePosition.y(),pickedPoint)){ /* qDebug("Found point for move %i %i -> %f %f %f", currentMousePosition.x(), currentMousePosition.y(), @@ -98,7 +98,7 @@ void EditPickPointsPlugin::Decorate(MeshModel &mm, GLArea *gla, QPainter *painte pickPointsDialog->selectOrMoveThisPoint(pickedPoint); moveSelectPoint = false; - } else if(registerPoint && Pick(currentMousePosition.x(),gla->height()-currentMousePosition.y(),pickedPoint)) + } else if(registerPoint && Pick(currentMousePosition.x(),gla->height()-currentMousePosition.y(),pickedPoint)) { /* qDebug("Found point for add %i %i -> %f %f %f", currentMousePosition.x(), @@ -108,8 +108,7 @@ void EditPickPointsPlugin::Decorate(MeshModel &mm, GLArea *gla, QPainter *painte //find the normal of the face we just clicked CFaceO *face; - bool result = GLPickTri::PickClosestFace(currentMousePosition.x(),gla->height()-currentMousePosition.y(), - mm.cm, face); + bool result = GLPickTri::PickClosestFace(currentMousePosition.x(),gla->height()-currentMousePosition.y(),mm.cm, face); if(!result){ qDebug() << "find nearest face failed!"; @@ -173,7 +172,7 @@ bool EditPickPointsPlugin::StartEdit(MeshModel &mm, GLArea *gla ) return true; } -void EditPickPointsPlugin::EndEdit(MeshModel &mm, GLArea *gla) +void EditPickPointsPlugin::EndEdit(MeshModel &mm, GLArea * /*gla*/) { //qDebug() << "EndEdit Pick Points: " << mm.fileName.c_str() << " ..." << mm.cm.fn; @@ -272,13 +271,12 @@ void EditPickPointsPlugin::mouseReleaseEvent(QMouseEvent *event, MeshModel &mm, } void EditPickPointsPlugin::drawPickedPoints( - std::vector &pointVector, vcg::Box3f &boundingBox, QPainter *painter) + std::vector &pointVector, Box3m &boundingBox, QPainter *painter) { assert(glArea); - - vcg::Point3f size = boundingBox.Dim(); + Point3m size = boundingBox.Dim(); //how we scale the object indicating the normal at each selected point - float scaleFactor = (size[0]+size[1]+size[2])/90.0; + Scalarm scaleFactor = (size[0]+size[1]+size[2])/90.0; //qDebug() << "scaleFactor: " << scaleFactor; @@ -302,7 +300,7 @@ void EditPickPointsPlugin::drawPickedPoints( PickedPointTreeWidgetItem * item = pointVector[i]; //if the point has been set (it may not be if a template has been loaded) if(item->isActive()){ - Point3f point = item->getPoint(); + Point3m point = item->getPoint(); glColor(Color4b::Blue); glLabel::render(painter,point, QString(item->getName())); @@ -330,29 +328,26 @@ void EditPickPointsPlugin::drawPickedPoints( glMatrixMode(GL_MODELVIEW); - Point3f yaxis; - yaxis[0] = 0; - yaxis[1] = 1; - yaxis[2] = 0; + Point3m yaxis(Scalarm(0),Scalarm(1),Scalarm(0)); for(int i = 0; i < pointVector.size(); ++i) { PickedPointTreeWidgetItem * item = pointVector[i]; //if the point has been set (it may not be if a template has been loaded) if(item->isActive()){ - Point3f point = item->getPoint(); + Point3m point = item->getPoint(); if(showNormal) { - Point3f normal = item->getNormal(); + Point3m normal = item->getNormal(); if(showPin) { //dot product - float angle = (Angle(normal,yaxis) * 180.0 / PI); + Scalarm angle = (Angle(normal,yaxis) * 180.0 / PI); //cross product - Point3f axis = yaxis^normal; + Point3m axis = yaxis^normal; //qDebug() << "angle: " << angle << " x" << axis[0] << " y" << axis[1] << " z" << axis[2]; //bluegreen and a little clear @@ -412,7 +407,6 @@ void EditPickPointsPlugin::drawPickedPoints( if(item->isSelected() ) glColor4f(0.0f, 1.0f, 0.0f, 0.7f); glEnd(); - glPopMatrix(); } else { @@ -424,15 +418,13 @@ void EditPickPointsPlugin::drawPickedPoints( glEnd(); } } - glColor(Color4b::Red); - glArea->renderText(point[0], point[1], point[2], QString(item->getName()) ); + //glArea->renderText(point[0], point[1], point[2], QString(item->getName()) ); } } - glDisable(GL_BLEND); glDisable(GL_COLOR_MATERIAL); glDisable(GL_DEPTH_TEST); - glPopAttrib(); + } diff --git a/src/meshlabplugins/edit_pickpoints/editpickpoints.h b/src/meshlabplugins/edit_pickpoints/editpickpoints.h index fb7011566..ac3d674dc 100644 --- a/src/meshlabplugins/edit_pickpoints/editpickpoints.h +++ b/src/meshlabplugins/edit_pickpoints/editpickpoints.h @@ -60,7 +60,7 @@ public: //basically copied from void AlignPairWidget::drawPickedPoints in editalign plugin //Draws all the picked points on the screen //boundingBox - gives some indication how to scale the normal flags - void drawPickedPoints(std::vector &pointVector, vcg::Box3f &boundingBox, QPainter *painter); + void drawPickedPoints(std::vector &pointVector, Box3m &boundingBox, QPainter *painter); private: //the current place the mouse clicked diff --git a/src/meshlabplugins/edit_pickpoints/pickedPoints.cpp b/src/meshlabplugins/edit_pickpoints/pickedPoints.cpp index 1a6da3b72..8178f7848 100644 --- a/src/meshlabplugins/edit_pickpoints/pickedPoints.cpp +++ b/src/meshlabplugins/edit_pickpoints/pickedPoints.cpp @@ -63,17 +63,22 @@ const QString PickedPoints::False = "0"; const std::string PickedPoints::Key = "PickedPoints"; -PickedPoints::PickedPoints(){ - pointVector = new std::vector(); +PickedPoints::PickedPoints() +:pointVector() +{ } -PickedPoints::~PickedPoints(){ - delete pointVector; +PickedPoints::~PickedPoints() +{ + for(size_t ii = 0; ii < pointVector.size();++ii) + delete pointVector[ii]; + pointVector.clear(); + } bool PickedPoints::open(QString filename){ QDomDocument doc; - pointVector->clear(); + pointVector.clear(); QFile file(filename); @@ -106,7 +111,7 @@ bool PickedPoints::open(QString filename){ QString y = element.attribute(yCoordinate); QString z = element.attribute(zCoordinate); - vcg::Point3f point(x.toFloat(), y.toFloat(), z.toFloat()); + Point3m point(x.toDouble(), y.toDouble(), z.toDouble()); QString presentString = element.attribute(active); bool present = true; @@ -165,12 +170,12 @@ bool PickedPoints::save(QString filename, QString dataFileName){ dataTag.appendChild(data); //create an element for each point - for (int i = 0; i < pointVector->size(); ++i) { - PickedPoint *pickedPoint = pointVector->at(i); + for (int i = 0; i < pointVector.size(); ++i) { + PickedPoint *pickedPoint = pointVector.at(i); QDomElement tag = doc.createElement(pointElementName); - vcg::Point3f point = pickedPoint->point; + Point3m point = pickedPoint->point; tag.setAttribute(xCoordinate, point[0] ); tag.setAttribute(yCoordinate, point[1] ); @@ -197,42 +202,41 @@ bool PickedPoints::save(QString filename, QString dataFileName){ return true; } -void PickedPoints::addPoint(QString name, vcg::Point3f point, bool present){ - assert(pointVector); - +void PickedPoints::addPoint(QString name, Point3m point, bool present) +{ PickedPoint *pickedPoint = new PickedPoint(name, point, present); - pointVector->push_back(pickedPoint); + pointVector.push_back(pickedPoint); } -std::vector * PickedPoints::getPickedPointVector() +std::vector& PickedPoints::getPickedPointVector() { return pointVector; } -std::vector * PickedPoints::getPoint3fVector() +std::vector * PickedPoints::getPoint3Vector() { - std::vector *points = new std::vector(); + std::vector *points = new std::vector(); - for(int i = 0; i < pointVector->size(); i++) + for(size_t i = 0; i < pointVector.size(); i++) { - if(pointVector->at(i)->present ) - points->push_back(pointVector->at(i)->point); + if(pointVector.at(i)->present ) + points->push_back(pointVector.at(i)->point); } return points; } -void PickedPoints::translatePoints(vcg::Matrix44f &translation) +void PickedPoints::translatePoints(Matrix44m &translation) { - for(int i = 0; i < pointVector->size(); i++) + for(size_t i = 0; i < pointVector.size(); i++) { - PickedPoint* temp = pointVector->at(i); + PickedPoint* temp = pointVector.at(i); //qDebug() << " point was x" << temp->point[0] << " y " << temp->point[1] << " z " << temp->point[2]; - vcg::Point4f inputPoint(temp->point[0], temp->point[1], temp->point[2], 1); + Point4m inputPoint(temp->point[0], temp->point[1], temp->point[2], 1); - vcg::Point4f resultPoint = translation * inputPoint; + Point4m resultPoint = translation * inputPoint; temp->point[0] = resultPoint[0]; temp->point[1] = resultPoint[1]; diff --git a/src/meshlabplugins/edit_pickpoints/pickedPoints.h b/src/meshlabplugins/edit_pickpoints/pickedPoints.h index 474c64a9f..9c4b75359 100644 --- a/src/meshlabplugins/edit_pickpoints/pickedPoints.h +++ b/src/meshlabplugins/edit_pickpoints/pickedPoints.h @@ -38,7 +38,7 @@ class PickedPoint { public: - PickedPoint(QString _name, vcg::Point3f _point, bool _present){ + PickedPoint(QString _name, Point3m _point, bool _present){ name = _name; point = _point; present = _present; @@ -52,7 +52,7 @@ public: bool present; //point - vcg::Point3f point; + Point3m point; }; class PickedPoints @@ -70,16 +70,16 @@ public: bool save(QString filename, QString dataFileName); //add a point to the map - void addPoint(QString name, vcg::Point3f point, bool present); + void addPoint(QString name, Point3m point, bool present); - std::vector * getPickedPointVector(); + std::vector& getPickedPointVector(); //get a vector containing only active points - std::vector * getPoint3fVector(); + std::vector * getPoint3Vector(); //translate each point using the matrix //if the mesh moves you can then translate the points useing this function - void translatePoints(vcg::Matrix44f &translation); + void translatePoints(Matrix44m &translation); //get the suggested filename for the points. will be based on the mesh's filename static QString getSuggestedPickedPointsFileName(const MeshModel &meshModel); @@ -99,7 +99,7 @@ public: private: //data - std::vector *pointVector; + std::vector pointVector; //the template that was used to pick these points //will be "" if no template was used diff --git a/src/meshlabplugins/edit_pickpoints/pickpointsDialog.cpp b/src/meshlabplugins/edit_pickpoints/pickpointsDialog.cpp index 27aece007..f001e1f25 100644 --- a/src/meshlabplugins/edit_pickpoints/pickpointsDialog.cpp +++ b/src/meshlabplugins/edit_pickpoints/pickpointsDialog.cpp @@ -58,7 +58,6 @@ public: { unifGrid.Set(m->face.begin(),m->face.end()); markerFunctor.SetMesh(m); - dist_upper_bound = m->bbox.Diag()/10.0f; } } @@ -69,14 +68,14 @@ public: MarkerFace markerFunctor; - float dist_upper_bound; + Scalarm dist_upper_bound; - CMeshO::FaceType * getFace(vcg::Point3f &p) + CMeshO::FaceType * getFace(Point3m &p) { assert(m); // the results - vcg::Point3f closestPt; - float dist = dist_upper_bound; + Point3m closestPt; + Scalarm dist = dist_upper_bound; const CMeshO::CoordType &startPt = p; // compute distance between startPt and the mesh S2 @@ -93,7 +92,7 @@ public: }; PickedPointTreeWidgetItem::PickedPointTreeWidgetItem( - vcg::Point3f &intputPoint, CMeshO::FaceType::NormalType &faceNormal, + Point3m &intputPoint, CMeshO::FaceType::NormalType &faceNormal, QString name, bool _active) : QTreeWidgetItem(1001) { //name @@ -114,7 +113,7 @@ QString PickedPointTreeWidgetItem::getName(){ return text(0); } -void PickedPointTreeWidgetItem::setPointAndNormal(vcg::Point3f &intputPoint, CMeshO::FaceType::NormalType &faceNormal) +void PickedPointTreeWidgetItem::setPointAndNormal(Point3m &intputPoint, CMeshO::FaceType::NormalType &faceNormal) { point[0] = intputPoint[0]; point[1] = intputPoint[1]; @@ -136,11 +135,11 @@ void PickedPointTreeWidgetItem::setPointAndNormal(vcg::Point3f &intputPoint, CMe setText(3, tempString); } -vcg::Point3f PickedPointTreeWidgetItem::getPoint(){ +Point3m PickedPointTreeWidgetItem::getPoint(){ return point; } -vcg::Point3f PickedPointTreeWidgetItem::getNormal(){ +Point3m PickedPointTreeWidgetItem::getNormal(){ return normal; } @@ -258,7 +257,7 @@ PickPointsDialog::~PickPointsDialog() delete getClosestFace; } -void PickPointsDialog::addMoveSelectPoint(Point3f point, CMeshO::FaceType::NormalType faceNormal) +void PickPointsDialog::addMoveSelectPoint(Point3m point, CMeshO::FaceType::NormalType faceNormal) { if(currentMode == ADD_POINT) { @@ -323,7 +322,7 @@ void PickPointsDialog::recordNextPointForUndo() recordPointForUndo = true; } -void PickPointsDialog::selectOrMoveThisPoint(Point3f point){ +void PickPointsDialog::selectOrMoveThisPoint(Point3m point){ qDebug() << "point is: " << point[0] << " " << point[1] << " " << point[2]; //the item closest to the given point @@ -331,22 +330,22 @@ void PickPointsDialog::selectOrMoveThisPoint(Point3f point){ //the smallest distance from the given point to one in the list //so far.... - float minDistanceSoFar = -1.0; + Scalarm minDistanceSoFar = -1.0; for(int i = 0; i < pickedPointTreeWidgetItemVector.size(); i++){ PickedPointTreeWidgetItem *item = pickedPointTreeWidgetItemVector.at(i); - Point3f tempPoint = item->getPoint(); + Point3m tempPoint = item->getPoint(); //qDebug() << "tempPoint is: " << tempPoint[0] << " " << tempPoint[1] << " " << tempPoint[2]; - float temp = sqrt(pow(point[0]-tempPoint[0],2) + - pow(point[1]-tempPoint[1],2) + - pow(point[2]-tempPoint[2],2)); + Scalarm temp = std::sqrt(std::pow(point[0]-tempPoint[0],2) + + std::pow(point[1]-tempPoint[1],2) + + std::pow(point[2]-tempPoint[2],2)); //qDebug() << "distance is: " << temp; - if(minDistanceSoFar < 0 || minDistanceSoFar > temp){ + if(minDistanceSoFar < Scalarm(0) || minDistanceSoFar > temp){ minDistanceSoFar = temp; closestItem = item; } @@ -377,7 +376,7 @@ bool PickPointsDialog::drawNormalAsPin() return ui.pinRadioButton->isChecked(); } -void PickPointsDialog::addPoint(vcg::Point3f &point, QString &name, bool present) +void PickPointsDialog::addPoint(Point3m &point, QString &name, bool present) { //bool result = GLPickTri::PickNearestFace(currentMousePosition.x(),gla->height()-currentMousePosition.y(), // mm.cm, face); @@ -401,12 +400,12 @@ void PickPointsDialog::addPoint(vcg::Point3f &point, QString &name, bool present addTreeWidgetItemForPoint(point, name, face->N(), present); else { - vcg::Point3f faceNormal; + Point3m faceNormal; addTreeWidgetItemForPoint(point, name, faceNormal, present); } } -PickedPointTreeWidgetItem * PickPointsDialog::addTreeWidgetItemForPoint(vcg::Point3f &point, QString &name, CMeshO::FaceType::NormalType &faceNormal, bool present) +PickedPointTreeWidgetItem * PickPointsDialog::addTreeWidgetItemForPoint(Point3m &point, QString &name, CMeshO::FaceType::NormalType &faceNormal, bool present) { PickedPointTreeWidgetItem *widgetItem = new PickedPointTreeWidgetItem(point, faceNormal, name, present); @@ -490,8 +489,8 @@ void PickPointsDialog::loadPickPointsTemplate(QString filename) PickPointsTemplate::load(filename, &pointNameVector); for(int i = 0; i < pointNameVector.size(); i++){ - vcg::Point3f point; - vcg::Point3f faceNormal; + Point3m point; + Point3m faceNormal; PickedPointTreeWidgetItem *widgetItem = addTreeWidgetItemForPoint(point, pointNameVector.at(i), faceNormal, false); widgetItem->clearPoint(); @@ -533,6 +532,7 @@ void PickPointsDialog::setCurrentMeshModel(MeshModel *newMeshModel, GLArea *gla) //make sure we start in pick mode togglePickMode(true); + meshModel->updateDataMask(MeshModel::MM_FACEMARK); //set up the getClosestFace->init(&(meshModel->cm)); @@ -549,11 +549,11 @@ void PickPointsDialog::setCurrentMeshModel(MeshModel *newMeshModel, GLArea *gla) const QString &name = pickedPoints->getTemplateName(); setTemplateName(name); - std::vector * pickedPointVector = pickedPoints->getPickedPointVector(); + std::vector& pickedPointVector = pickedPoints->getPickedPointVector(); PickedPoint *point; - for(int i = 0; i < pickedPointVector->size(); i++){ - point = pickedPointVector->at(i); + for(size_t i = 0; i < pickedPointVector.size(); i++){ + point = pickedPointVector.at(i); addPoint(point->point, point->name, point->present); } @@ -747,10 +747,10 @@ void PickPointsDialog::loadPoints(QString filename){ const QString &name = pickedPoints.getTemplateName(); setTemplateName(name); - std::vector *points = pickedPoints.getPickedPointVector(); + std::vector& points = pickedPoints.getPickedPointVector(); - for(int i = 0; i < points->size(); i++){ - PickedPoint *pickedPoint = points->at(i); + for(size_t i = 0; i < points.size(); i++){ + PickedPoint *pickedPoint = points.at(i); addPoint(pickedPoint->point, pickedPoint->name, pickedPoint->present); } @@ -879,8 +879,8 @@ void PickPointsDialog::addPointToTemplate() if(!templateLoaded) setTemplateName("new Template"); - vcg::Point3f point; - vcg::Point3f faceNormal; + Point3m point; + Point3m faceNormal; QString name("new point"); PickedPointTreeWidgetItem *widgetItem = addTreeWidgetItemForPoint(point, name, faceNormal, false); @@ -892,8 +892,8 @@ void PickPointsDialog::undo() { if(NULL != lastPointToMove) { - vcg::Point3f tempPoint = lastPointToMove->getPoint(); - vcg::Point3f tempNormal = lastPointToMove->getNormal(); + Point3m tempPoint = lastPointToMove->getPoint(); + Point3m tempNormal = lastPointToMove->getNormal(); lastPointToMove->setPointAndNormal(lastPointPosition, lastPointNormal); diff --git a/src/meshlabplugins/edit_pickpoints/pickpointsDialog.h b/src/meshlabplugins/edit_pickpoints/pickpointsDialog.h index d157069b0..3dbb52e24 100644 --- a/src/meshlabplugins/edit_pickpoints/pickpointsDialog.h +++ b/src/meshlabplugins/edit_pickpoints/pickpointsDialog.h @@ -48,7 +48,7 @@ class PickedPointTreeWidgetItem : public QTreeWidgetItem public: //used when a point has just been picked and //gives it an integer name - PickedPointTreeWidgetItem(vcg::Point3f &intputPoint, CMeshO::FaceType::NormalType &faceNormal, + PickedPointTreeWidgetItem(Point3m &intputPoint, CMeshO::FaceType::NormalType &faceNormal, QString name, bool _active); //set the name @@ -58,13 +58,13 @@ public: QString getName(); //change the point and normal - void setPointAndNormal(vcg::Point3f &intputPoint, CMeshO::FaceType::NormalType &faceNormal); + void setPointAndNormal(Point3m &intputPoint, CMeshO::FaceType::NormalType &faceNormal); - //return the Point3f - vcg::Point3f getPoint(); + //return the Point3m + Point3m getPoint(); //get the normal - vcg::Point3f getNormal(); + Point3m getNormal(); //clear the ponint datas void clearPoint(); @@ -81,10 +81,10 @@ public: private: //the point - vcg::Point3f point; + Point3m point; //the normal of this point - vcg::Point3f normal; + Point3m normal; //whether this point is active //inactive points are not drawn and when saved this is indicated @@ -105,10 +105,10 @@ public: enum Mode { ADD_POINT, MOVE_POINT, SELECT_POINT }; //do soemthing with the point that was just picked(could be add,moving or select) - void addMoveSelectPoint(vcg::Point3f point, CMeshO::FaceType::NormalType faceNormal); + void addMoveSelectPoint(Point3m point, CMeshO::FaceType::NormalType faceNormal); //we need to move the point closest to this one or select it depending on the mode - void selectOrMoveThisPoint(vcg::Point3f point); + void selectOrMoveThisPoint(Point3m point); //return the vector //useful if you want to draw the points @@ -140,10 +140,10 @@ private: //add a new point and call it something //bool present tells us if the point has been picked yet - void addPoint(vcg::Point3f &point, QString &name, bool present); + void addPoint(Point3m &point, QString &name, bool present); //handle everything involved with adding a point to the tree widget - PickedPointTreeWidgetItem * addTreeWidgetItemForPoint(vcg::Point3f &point, QString &name, CMeshO::FaceType::NormalType &faceNormal, bool present); + PickedPointTreeWidgetItem * addTreeWidgetItemForPoint(Point3m &point, QString &name, CMeshO::FaceType::NormalType &faceNormal, bool present); //load the points from a file void loadPoints(QString filename); @@ -200,8 +200,8 @@ private: //variables needed for undo PickedPointTreeWidgetItem *lastPointToMove; - vcg::Point3f lastPointPosition; - vcg::Point3f lastPointNormal; + Point3m lastPointPosition; + Point3m lastPointNormal; bool recordPointForUndo; QString templateWorkingDirectory;