From b4fbff89bf2d8c5a727779db3dabde58096cd58c Mon Sep 17 00:00:00 2001 From: Paolo Cignoni cignoni Date: Sun, 4 Sep 2011 21:11:06 +0000 Subject: [PATCH] added decoration for showing texture seams --- .../decorate_base/decorate_base.cpp | 83 ++++++++++++++++- .../decorate_base/decorate_base.h | 93 ++++++++++--------- 2 files changed, 126 insertions(+), 50 deletions(-) diff --git a/src/meshlabplugins/decorate_base/decorate_base.cpp b/src/meshlabplugins/decorate_base/decorate_base.cpp index 0d65bd865..26d8724f2 100644 --- a/src/meshlabplugins/decorate_base/decorate_base.cpp +++ b/src/meshlabplugins/decorate_base/decorate_base.cpp @@ -40,9 +40,10 @@ QString ExtraMeshDecoratePlugin::filterInfo(QAction *action) const { case DP_SHOW_AXIS : return tr("Draws XYZ axes in world coordinates"); case DP_SHOW_BOX_CORNERS: return tr("Draws object's bounding box corners"); - case DP_SHOW_VERT: return tr("Draw the vertices of the mesh as round dots"); + case DP_SHOW_VERT: return tr("Draw the vertices of the mesh as round dots"); case DP_SHOW_NON_FAUX_EDGE: return tr("Draws the edge of the mesh that are tagged as 'real edges' (useful for quadmeshes)."); case DP_SHOW_BOUNDARY: return tr("Draws the edge of the mesh that are on the boundary."); + case DP_SHOW_BOUNDARY_TEX: return tr("Draws the edge where there is a texture seam."); case DP_SHOW_NON_MANIF_EDGE: return tr("Draws the non manifold edges of the current mesh"); case DP_SHOW_NON_MANIF_VERT: return tr("Draws the non manifold vertices of the current mesh"); case DP_SHOW_BOX_CORNERS_ABS : return tr("Show Box Corners (Abs)"); @@ -68,6 +69,7 @@ QString ExtraMeshDecoratePlugin::filterName(FilterIDType filter) const case DP_SHOW_VERT : return QString("Show Vertex Dots"); case DP_SHOW_NON_FAUX_EDGE : return QString("Show Non-Faux Edges"); case DP_SHOW_BOUNDARY : return QString("Show Boundary Edges"); + case DP_SHOW_BOUNDARY_TEX : return QString("Show Texture Seams"); case DP_SHOW_NON_MANIF_EDGE : return QString("Show Non Manif Edges"); case DP_SHOW_NON_MANIF_VERT: return QString("Show Non Manif Vertices"); case DP_SHOW_VERT_NORMALS : return QString("Show Vertex Normals"); @@ -387,8 +389,34 @@ void ExtraMeshDecoratePlugin::decorate(QAction *a, MeshDocument &md, RichParamet glPopAttrib(); } } - } - break; + } break; + case DP_SHOW_BOUNDARY_TEX : + { + // Note the standard way for adding extra per-mesh data using the per-mesh attributes. + CMeshO::PerMeshAttributeHandle< vector > btvH = vcg::tri::Allocator::GetPerMeshAttribute >(m.cm,"BoundaryTexVector"); + if(vcg::tri::Allocator::IsValidHandle (m.cm, btvH)) + { + vector *BTVp = &btvH(); + if (BTVp->size() != 0) + { + glPushAttrib(GL_ENABLE_BIT|GL_VIEWPORT_BIT| GL_CURRENT_BIT | GL_DEPTH_BUFFER_BIT); + glDisable(GL_LIGHTING); + glDisable(GL_TEXTURE_2D); + glDepthFunc(GL_LEQUAL); + glEnable(GL_LINE_SMOOTH); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glLineWidth(1.f); + glColor(Color4b::Green); + glDepthRange (0.0, 0.999); + glEnableClientState (GL_VERTEX_ARRAY); + glVertexPointer(3,GL_FLOAT,sizeof(Point3f),&(BTVp->begin()[0])); + glDrawArrays(GL_LINES,0,BTVp->size()); + glDisableClientState (GL_VERTEX_ARRAY); + glPopAttrib(); + } + } + } break; } // end switch; glPopMatrix(); @@ -400,7 +428,7 @@ void ExtraMeshDecoratePlugin::DrawQuotedBox(MeshModel &m,QPainter *gla,QFont qf) { glPushAttrib(GL_ENABLE_BIT | GL_LINE_BIT | GL_POINT_BIT | GL_CURRENT_BIT | GL_LIGHTING_BIT | GL_COLOR_BUFFER_BIT ); glDisable(GL_LIGHTING); - glDisable(GL_TEXTURE_2D); + glDisable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_LINE_SMOOTH); @@ -819,7 +847,6 @@ bool ExtraMeshDecoratePlugin::startDecorate(QAction * action, MeshDocument &md, { if(VisitedEdges[*fi][i]==0 && !(*fi).IsF(i)) { - CVertexO* startV=(*fi).V(i); face::Pos sp(&*fi,i,startV); do @@ -872,6 +899,43 @@ bool ExtraMeshDecoratePlugin::startDecorate(QAction * action, MeshDocument &md, } } + } break; + case DP_SHOW_BOUNDARY_TEX : + { + MeshModel *m=md.mm(); + m->updateDataMask(MeshModel::MM_FACEFACETOPO); + CMeshO::PerMeshAttributeHandle< vector > btvH = vcg::tri::Allocator::GetPerMeshAttribute< vector >(m->cm,"BoundaryTexVector"); + if(!vcg::tri::Allocator::IsValidHandle(m->cm,btvH)) + btvH=vcg::tri::Allocator::AddPerMeshAttribute< vector >(m->cm,std::string("BoundaryTexVector")); + vector *BTVp = &btvH(); + BTVp->clear(); + vector > SaveTopoVec; + CMeshO::FaceIterator fi; + for(fi = m->cm.face.begin(); fi!= m->cm.face.end();++fi) if(!(*fi).IsD()) + { + for(int i=0;i<3;++i) + SaveTopoVec.push_back(std::make_pair((*fi).FFp(i),(*fi).FFi(i))); + } + tri::UpdateTopology::FaceFaceFromTexCoord(m->cm); + for(fi = m->cm.face.begin(); fi!= m->cm.face.end();++fi) if(!(*fi).IsD()) + { + for(int i=0;i<3;++i) + if(face::IsBorder(*fi,i)) + { + BTVp->push_back((*fi).V0(i)->P()); + BTVp->push_back((*fi).V1(i)->P()); + } + } + vector >::iterator iii; + for(fi = m->cm.face.begin(), iii=SaveTopoVec.begin(); fi!= m->cm.face.end();++fi) if(!(*fi).IsD()) + { + for(int i=0;i<3;++i) + { + (*fi).FFp(i)= iii->first; + (*fi).FFi(i)= iii->second; + } + } + } break; case DP_SHOW_NON_MANIF_VERT : { @@ -1245,6 +1309,15 @@ void ExtraMeshDecoratePlugin::DrawColorHistogram(CHist &ch, GLArea *gla, QPainte glMatrixMode(GL_MODELVIEW); } +// This function performs the Scale/Translation transform +// that is needed to correctly draw a single texture. +// When more than a single texture is used they are stacked vertically +void ExtraMeshDecoratePlugin::PlaceTexParam(int TexInd, int TexNum) +{ + +} + + void ExtraMeshDecoratePlugin::DrawTexParam(MeshModel &m, GLArea *gla, QPainter *painter, RichParameterSet *rm, QFont qf) { if(!m.hasDataMask(MeshModel::MM_WEDGTEXCOORD)) return; diff --git a/src/meshlabplugins/decorate_base/decorate_base.h b/src/meshlabplugins/decorate_base/decorate_base.h index 7eed94af9..824aaf969 100644 --- a/src/meshlabplugins/decorate_base/decorate_base.h +++ b/src/meshlabplugins/decorate_base/decorate_base.h @@ -38,25 +38,26 @@ class ExtraMeshDecoratePlugin : public QObject, public MeshDecorateInterface QString decorateInfo(QAction *) const; enum { - DP_SHOW_FACE_NORMALS, - DP_SHOW_VERT_NORMALS, - DP_SHOW_VERT, - DP_SHOW_EDGE, - DP_SHOW_NON_FAUX_EDGE, - DP_SHOW_BOUNDARY, - DP_SHOW_NON_MANIF_EDGE, - DP_SHOW_NON_MANIF_VERT, - DP_SHOW_VERT_PRINC_CURV_DIR, - DP_SHOW_BOX_CORNERS, - DP_SHOW_BOX_CORNERS_ABS, - DP_SHOW_AXIS, - DP_SHOW_QUOTED_BOX, - DP_SHOW_VERT_LABEL, - DP_SHOW_VERT_QUALITY_HISTOGRAM, - DP_SHOW_FACE_QUALITY_HISTOGRAM, - DP_SHOW_FACE_LABEL, - DP_SHOW_CAMERA, - DP_SHOW_TEXPARAM, + DP_SHOW_FACE_NORMALS, + DP_SHOW_VERT_NORMALS, + DP_SHOW_VERT, + DP_SHOW_EDGE, + DP_SHOW_NON_FAUX_EDGE, + DP_SHOW_BOUNDARY, + DP_SHOW_NON_MANIF_EDGE, + DP_SHOW_NON_MANIF_VERT, + DP_SHOW_VERT_PRINC_CURV_DIR, + DP_SHOW_BOX_CORNERS, + DP_SHOW_BOX_CORNERS_ABS, + DP_SHOW_AXIS, + DP_SHOW_QUOTED_BOX, + DP_SHOW_VERT_LABEL, + DP_SHOW_VERT_QUALITY_HISTOGRAM, + DP_SHOW_FACE_QUALITY_HISTOGRAM, + DP_SHOW_FACE_LABEL, + DP_SHOW_CAMERA, + DP_SHOW_TEXPARAM, + DP_SHOW_BOUNDARY_TEX }; QString filterName(FilterIDType filter) const; @@ -73,44 +74,46 @@ private: void drawHistogram(QGLWidget *gla, CHist &ch); public: - ExtraMeshDecoratePlugin() - { - typeList << - DP_SHOW_VERT << - DP_SHOW_NON_FAUX_EDGE << - DP_SHOW_BOUNDARY << - DP_SHOW_NON_MANIF_EDGE << - DP_SHOW_NON_MANIF_VERT << - DP_SHOW_FACE_NORMALS << - DP_SHOW_VERT_NORMALS << - DP_SHOW_VERT_QUALITY_HISTOGRAM << - DP_SHOW_FACE_QUALITY_HISTOGRAM << - DP_SHOW_VERT_PRINC_CURV_DIR << - DP_SHOW_BOX_CORNERS << - DP_SHOW_BOX_CORNERS_ABS << - DP_SHOW_AXIS << - DP_SHOW_QUOTED_BOX << - DP_SHOW_VERT_LABEL << - DP_SHOW_FACE_LABEL << - DP_SHOW_CAMERA << - DP_SHOW_TEXPARAM; + ExtraMeshDecoratePlugin() + { + typeList << + DP_SHOW_VERT << + DP_SHOW_NON_FAUX_EDGE << + DP_SHOW_BOUNDARY << + DP_SHOW_NON_MANIF_EDGE << + DP_SHOW_NON_MANIF_VERT << + DP_SHOW_FACE_NORMALS << + DP_SHOW_VERT_NORMALS << + DP_SHOW_VERT_QUALITY_HISTOGRAM << + DP_SHOW_FACE_QUALITY_HISTOGRAM << + DP_SHOW_VERT_PRINC_CURV_DIR << + DP_SHOW_BOX_CORNERS << + DP_SHOW_BOX_CORNERS_ABS << + DP_SHOW_AXIS << + DP_SHOW_QUOTED_BOX << + DP_SHOW_VERT_LABEL << + DP_SHOW_FACE_LABEL << + DP_SHOW_CAMERA << + DP_SHOW_TEXPARAM << + DP_SHOW_BOUNDARY_TEX; - FilterIDType tt; - foreach(tt , types()){ + FilterIDType tt; + foreach(tt , types()){ actionList << new QAction(filterName(tt), this); - } - QAction *ap; + } + QAction *ap; foreach(ap,actionList){ ap->setCheckable(true); } } - void DrawBBoxCorner(MeshModel &m, bool absBBoxFlag=true); + void DrawBBoxCorner(MeshModel &m, bool absBBoxFlag=true); void DrawQuotedBox(MeshModel &m,QPainter *gla, QFont qf); void DrawVertLabel(MeshModel &m, QPainter *gla); void DrawFaceLabel(MeshModel &m, QPainter *gla); void DisplayCamera(MeshModel *m, vcg::Shotf &ls, int cameraSourceId, QPainter *painter, QFont qf); void DrawCamera(MeshModel *m, vcg::Shotf &ls, vcg::Color4b camcolor, vcg::Matrix44f &currtr, RichParameterSet *rm, QPainter *painter, QFont qf); + void PlaceTexParam(int TexInd, int TexNum); void DrawTexParam(MeshModel &m, GLArea *gla, QPainter *painter, RichParameterSet *, QFont qf); void DrawColorHistogram(CHist &ch, GLArea *gla, QPainter *painter, RichParameterSet *, QFont qf);