mirror of
https://github.com/lucaspalomodevelop/meshlab.git
synced 2026-03-20 03:16:10 +00:00
Definitely removed the double applying interface of filters. Now apply filter must use the applyFilter ( MeshDocument )
This commit is contained in:
parent
46a40f5606
commit
a811adfc79
@ -23,6 +23,8 @@
|
||||
|
||||
#ifndef MESHLAB_INTERFACES_H
|
||||
#define MESHLAB_INTERFACES_H
|
||||
#include <GL/glew.h>
|
||||
|
||||
#include <QtCore>
|
||||
#include <QApplication>
|
||||
#include <QAction>
|
||||
@ -272,23 +274,23 @@ public:
|
||||
|
||||
enum FilterClass
|
||||
{
|
||||
Generic =0x00000, // Should be avoided if possible
|
||||
Selection =0x00001, // select or de-select something, basic operation on selections (like deleting)
|
||||
Cleaning =0x00002, // Filters that can be used to clean meshes (duplicated vertices etc)
|
||||
Remeshing =0x00004, // Simplification, Refinement, Reconstruction and mesh optimization
|
||||
FaceColoring =0x00008,
|
||||
VertexColoring =0x00010,
|
||||
MeshCreation =0x00020,
|
||||
Smoothing =0x00040, // Stuff that does not change the topology, but just the vertex positions
|
||||
Quality =0x00080,
|
||||
Layer =0x00100, // Layers, attributes
|
||||
Normal =0x00200, // Normal, Curvature, orientation (rotations and transformations fall here)
|
||||
Sampling =0x00400,
|
||||
Texture =0x00800,
|
||||
RangeMap =0x01000, // filters specific for range map processing
|
||||
PointSet =0x02000,
|
||||
Measure =0x04000 // Filters that compute measures and information on meshes.
|
||||
};
|
||||
Generic =0x00000, // Should be avoided if possible
|
||||
Selection =0x00001, // select or de-select something, basic operation on selections (like deleting)
|
||||
Cleaning =0x00002, // Filters that can be used to clean meshes (duplicated vertices etc)
|
||||
Remeshing =0x00004, // Simplification, Refinement, Reconstruction and mesh optimization
|
||||
FaceColoring =0x00008,
|
||||
VertexColoring =0x00010,
|
||||
MeshCreation =0x00020,
|
||||
Smoothing =0x00040, // Stuff that does not change the topology, but just the vertex positions
|
||||
Quality =0x00080,
|
||||
Layer =0x00100, // Layers, attributes
|
||||
Normal =0x00200, // Normal, Curvature, orientation (rotations and transformations fall here)
|
||||
Sampling =0x00400,
|
||||
Texture =0x00800,
|
||||
RangeMap =0x01000, // filters specific for range map processing
|
||||
PointSet =0x02000,
|
||||
Measure =0x04000 // Filters that compute measures and information on meshes.
|
||||
};
|
||||
|
||||
|
||||
// The FilterPrecondition enum is used to build the prerequisite bitmask that each filter reports.
|
||||
@ -356,11 +358,7 @@ public:
|
||||
// this function will also be called by the commandline framework.
|
||||
// If you want report errors, use the errorMsg() string. It will displayed in case of filters returning false.
|
||||
|
||||
virtual bool applyFilter(QAction * /*filter*/, MeshModel &/*m*/, RichParameterSet & /* par */, vcg::CallBackPos * /*cb*/) = 0;
|
||||
virtual bool applyFilter(QAction * filter, MeshDocument &md, RichParameterSet & par, vcg::CallBackPos *cb)
|
||||
{
|
||||
return applyFilter(filter,*(md.mm()),par,cb);
|
||||
}
|
||||
virtual bool applyFilter(QAction * filter, MeshDocument &md, RichParameterSet & par, vcg::CallBackPos *cb) =0;
|
||||
|
||||
// Function used by the framework to test if a filter is applicable to a mesh.
|
||||
// For istance a colorize by quality filter cannot be applied to a mesh without per-vertex-quality.
|
||||
|
||||
@ -96,6 +96,19 @@ bool MeshDocument::delMesh(MeshModel *mmToDel)
|
||||
|
||||
return true;
|
||||
}
|
||||
bool MeshModel::Render(vcg::GLW::DrawMode _dm, vcg::GLW::ColorMode _cm, vcg::GLW::TextureMode _tm)
|
||||
{
|
||||
// Needed to be defined here for splatrender as long there is no "MeshlabCore" library.
|
||||
using namespace vcg;
|
||||
glPushMatrix();
|
||||
glMultMatrix(cm.Tr);
|
||||
if( (_cm == GLW::CMPerFace) && (!tri::HasPerFaceColor(cm)) ) _cm=GLW::CMNone;
|
||||
if( (_tm == GLW::TMPerWedge )&& (!tri::HasPerWedgeTexCoord(cm)) ) _tm=GLW::TMNone;
|
||||
if( (_tm == GLW::TMPerWedgeMulti )&& (!tri::HasPerWedgeTexCoord(cm)) ) _tm=GLW::TMNone;
|
||||
glw.Draw(_dm,_cm,_tm);
|
||||
glPopMatrix();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MeshModel::RenderSelectedFaces()
|
||||
{
|
||||
@ -159,3 +172,99 @@ int MeshModel::io2mm(int single_iobit)
|
||||
} ;
|
||||
}
|
||||
|
||||
void MeshModelState::create(int _mask, MeshModel* _m)
|
||||
{
|
||||
m=_m;
|
||||
changeMask=_mask;
|
||||
if(changeMask & MeshModel::MM_VERTCOLOR)
|
||||
{
|
||||
vertColor.resize(m->cm.vert.size());
|
||||
std::vector<vcg::Color4b>::iterator ci;
|
||||
CMeshO::VertexIterator vi;
|
||||
for(vi = m->cm.vert.begin(), ci = vertColor.begin(); vi != m->cm.vert.end(); ++vi, ++ci)
|
||||
if(!(*vi).IsD()) (*ci)=(*vi).C();
|
||||
}
|
||||
|
||||
if(changeMask & MeshModel::MM_VERTCOORD)
|
||||
{
|
||||
vertCoord.resize(m->cm.vert.size());
|
||||
std::vector<vcg::Point3f>::iterator ci;
|
||||
CMeshO::VertexIterator vi;
|
||||
for(vi = m->cm.vert.begin(), ci = vertCoord.begin(); vi != m->cm.vert.end(); ++vi, ++ci)
|
||||
if(!(*vi).IsD()) (*ci)=(*vi).P();
|
||||
}
|
||||
|
||||
if(changeMask & MeshModel::MM_VERTNORMAL)
|
||||
{
|
||||
vertNormal.resize(m->cm.vert.size());
|
||||
std::vector<vcg::Point3f>::iterator ci;
|
||||
CMeshO::VertexIterator vi;
|
||||
for(vi = m->cm.vert.begin(), ci = vertNormal.begin(); vi != m->cm.vert.end(); ++vi, ++ci)
|
||||
if(!(*vi).IsD()) (*ci)=(*vi).N();
|
||||
}
|
||||
|
||||
if(changeMask & MeshModel::MM_FACEFLAGSELECT)
|
||||
{
|
||||
faceSelection.resize(m->cm.face.size());
|
||||
std::vector<bool>::iterator ci;
|
||||
CMeshO::FaceIterator fi;
|
||||
for(fi = m->cm.face.begin(), ci = faceSelection.begin(); fi != m->cm.face.end(); ++fi, ++ci)
|
||||
if(!(*fi).IsD()) (*ci) = (*fi).IsS();
|
||||
}
|
||||
if(changeMask & MeshModel::MM_TRANSFMATRIX)
|
||||
Tr = m->cm.Tr;
|
||||
}
|
||||
|
||||
bool MeshModelState::apply(MeshModel *_m)
|
||||
{
|
||||
if(_m != m) return false;
|
||||
if(changeMask & MeshModel::MM_VERTCOLOR)
|
||||
{
|
||||
if(vertColor.size() != m->cm.vert.size()) return false;
|
||||
std::vector<vcg::Color4b>::iterator ci;
|
||||
CMeshO::VertexIterator vi;
|
||||
for(vi = m->cm.vert.begin(), ci = vertColor.begin(); vi != m->cm.vert.end(); ++vi, ++ci)
|
||||
if(!(*vi).IsD()) (*vi).C()=(*ci);
|
||||
}
|
||||
|
||||
if(changeMask & MeshModel::MM_VERTCOORD)
|
||||
{
|
||||
if(vertCoord.size() != m->cm.vert.size()) return false;
|
||||
std::vector<vcg::Point3f>::iterator ci;
|
||||
CMeshO::VertexIterator vi;
|
||||
for(vi = m->cm.vert.begin(), ci = vertCoord.begin(); vi != m->cm.vert.end(); ++vi, ++ci)
|
||||
if(!(*vi).IsD()) (*vi).P()=(*ci);
|
||||
}
|
||||
|
||||
if(changeMask & MeshModel::MM_VERTNORMAL)
|
||||
{
|
||||
if(vertNormal.size() != m->cm.vert.size()) return false;
|
||||
std::vector<vcg::Point3f>::iterator ci;
|
||||
CMeshO::VertexIterator vi;
|
||||
for(vi = m->cm.vert.begin(), ci=vertNormal.begin(); vi != m->cm.vert.end(); ++vi, ++ci)
|
||||
if(!(*vi).IsD()) (*vi).N()=(*ci);
|
||||
|
||||
//now reset the face normals
|
||||
vcg::tri::UpdateNormals<CMeshO>::PerFaceNormalized(m->cm);
|
||||
}
|
||||
|
||||
if(changeMask & MeshModel::MM_FACEFLAGSELECT)
|
||||
{
|
||||
if(faceSelection.size() != m->cm.face.size()) return false;
|
||||
std::vector<bool>::iterator ci;
|
||||
CMeshO::FaceIterator fi;
|
||||
for(fi = m->cm.face.begin(), ci = faceSelection.begin(); fi != m->cm.face.end(); ++fi, ++ci)
|
||||
{
|
||||
if((*ci))
|
||||
(*fi).SetS();
|
||||
else
|
||||
(*fi).ClearS();
|
||||
}
|
||||
}
|
||||
|
||||
if(changeMask & MeshModel::MM_TRANSFMATRIX)
|
||||
m->cm.Tr=Tr;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -134,50 +134,50 @@ public:
|
||||
- to know what elements are changed by a filter and therefore should be saved/restored in case of dynamic filters with a preview
|
||||
*/
|
||||
enum MeshElement {
|
||||
MM_NONE = 0x00000000,
|
||||
MM_NONE = 0x00000000,
|
||||
MM_VERTCOORD = 0x00000001,
|
||||
MM_VERTNORMAL = 0x00000002,
|
||||
MM_VERTFLAG = 0x00000004,
|
||||
MM_VERTCOLOR = 0x00000008,
|
||||
MM_VERTQUALITY = 0x00000010,
|
||||
MM_VERTQUALITY = 0x00000010,
|
||||
MM_VERTMARK = 0x00000020,
|
||||
MM_VERTFACETOPO = 0x00000040,
|
||||
MM_VERTFACETOPO = 0x00000040,
|
||||
MM_VERTCURV = 0x00000080,
|
||||
MM_VERTCURVDIR = 0x00000100,
|
||||
MM_VERTCURVDIR = 0x00000100,
|
||||
MM_VERTRADIUS = 0x00000200,
|
||||
MM_VERTTEXCOORD = 0x00000400,
|
||||
MM_VERTNUMBER = 0x00000800,
|
||||
MM_VERTTEXCOORD = 0x00000400,
|
||||
MM_VERTNUMBER = 0x00000800,
|
||||
|
||||
MM_FACEVERT = 0x00001000,
|
||||
MM_FACENORMAL = 0x00002000,
|
||||
MM_FACEFLAG = 0x00004000,
|
||||
MM_FACECOLOR = 0x00008000,
|
||||
MM_FACEQUALITY = 0x00010000,
|
||||
MM_FACEQUALITY = 0x00010000,
|
||||
MM_FACEMARK = 0x00020000,
|
||||
MM_FACEFACETOPO = 0x00040000,
|
||||
MM_FACENUMBER = 0x00080000,
|
||||
MM_FACEFACETOPO = 0x00040000,
|
||||
MM_FACENUMBER = 0x00080000,
|
||||
|
||||
MM_WEDGTEXCOORD = 0x00100000,
|
||||
MM_WEDGTEXCOORD = 0x00100000,
|
||||
MM_WEDGNORMAL = 0x00200000,
|
||||
MM_WEDGCOLOR = 0x00400000,
|
||||
|
||||
|
||||
MM_UNKNOWN = 0x00800000,
|
||||
MM_UNKNOWN = 0x00800000,
|
||||
|
||||
|
||||
// SubParts of bits
|
||||
MM_VERTFLAGSELECT = 0x01000000,
|
||||
MM_FACEFLAGSELECT = 0x02000000,
|
||||
MM_VERTFLAGSELECT = 0x01000000,
|
||||
MM_FACEFLAGSELECT = 0x02000000,
|
||||
// This part should be deprecated.
|
||||
MM_VERTFLAGBORDER = 0x04000000,
|
||||
MM_FACEFLAGBORDER = 0x08000000,
|
||||
MM_VERTFLAGBORDER = 0x04000000,
|
||||
MM_FACEFLAGBORDER = 0x08000000,
|
||||
|
||||
// Per Mesh Stuff....
|
||||
MM_CAMERA = 0x10000000,
|
||||
MM_TRANSFMATRIX = 0x20000000,
|
||||
MM_COLOR = 0x40000000,
|
||||
MM_POLYGONAL = 0x80000000,
|
||||
MM_ALL = 0xffffffff
|
||||
MM_CAMERA = 0x10000000,
|
||||
MM_TRANSFMATRIX = 0x20000000,
|
||||
MM_COLOR = 0x40000000,
|
||||
MM_POLYGONAL = 0x80000000,
|
||||
MM_ALL = 0xffffffff
|
||||
} ;
|
||||
|
||||
|
||||
@ -188,9 +188,8 @@ public:
|
||||
std::string fileName;
|
||||
|
||||
/*
|
||||
|
||||
Bitmask denoting what fields are currently used in the mesh
|
||||
it is composed by MeshElement enums.
|
||||
it is composed by MeshElement enums.
|
||||
it should be changed by only mean the following functions:
|
||||
|
||||
updateDataMask(neededStuff)
|
||||
@ -206,14 +205,7 @@ public:
|
||||
private:
|
||||
int currentDataMask;
|
||||
public:
|
||||
// Bitmask denoting what fields are loaded/saved
|
||||
// it is composed by OR-ing IOM_XXXX enums (defined in tri::io::Mask)
|
||||
// int ioMask;
|
||||
|
||||
bool visible; // used in rendering; Needed for toggling on and off the meshes
|
||||
|
||||
//abstract pointer to fileformat's dependent additional info
|
||||
//AdditionalInfo* addinfo;
|
||||
bool visible; // used in rendering; Needed for toggling on and off the meshes
|
||||
|
||||
MeshModel(const char *meshName=0) {
|
||||
glw.m=&cm;
|
||||
@ -223,28 +215,13 @@ public:
|
||||
currentDataMask |= MM_VERTCOORD | MM_VERTNORMAL | MM_VERTFLAG ;
|
||||
currentDataMask |= MM_FACEVERT | MM_FACENORMAL | MM_FACEFLAG ;
|
||||
|
||||
//ioMask= IOM_VERTCOORD | IOM_FACEINDEX | IOM_FLAGS | IOM_VERTNORMAL;
|
||||
|
||||
visible=true;
|
||||
visible=true;
|
||||
cm.Tr.SetIdentity();
|
||||
cm.sfn=0;
|
||||
if(meshName) fileName=meshName;
|
||||
}
|
||||
|
||||
bool Render(vcg::GLW::DrawMode _dm, vcg::GLW::ColorMode _cm, vcg::GLW::TextureMode _tm)
|
||||
{
|
||||
// Needed to be defined here for splatrender as long there is no "MeshlabCore" library.
|
||||
using namespace vcg;
|
||||
glPushMatrix();
|
||||
glMultMatrix(cm.Tr);
|
||||
if( (_cm == GLW::CMPerFace) && (!tri::HasPerFaceColor(cm)) ) _cm=GLW::CMNone;
|
||||
if( (_tm == GLW::TMPerWedge )&& (!tri::HasPerWedgeTexCoord(cm)) ) _tm=GLW::TMNone;
|
||||
if( (_tm == GLW::TMPerWedgeMulti )&& (!tri::HasPerWedgeTexCoord(cm)) ) _tm=GLW::TMNone;
|
||||
glw.Draw(_dm,_cm,_tm);
|
||||
glPopMatrix();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Render(vcg::GLW::DrawMode _dm, vcg::GLW::ColorMode _cm, vcg::GLW::TextureMode _tm);
|
||||
bool RenderSelectedFaces();
|
||||
|
||||
|
||||
@ -267,7 +244,7 @@ public:
|
||||
{
|
||||
return ((currentDataMask & maskToBeTested)!= 0);
|
||||
}
|
||||
void updateDataMask(MeshModel *m)
|
||||
void updateDataMask(MeshModel *m)
|
||||
{
|
||||
updateDataMask(m->currentDataMask);
|
||||
}
|
||||
@ -462,104 +439,9 @@ private:
|
||||
vcg::Matrix44f Tr;
|
||||
public:
|
||||
// This function save the <mask> portion of a mesh into the private members of the MeshModelState class;
|
||||
void create(int _mask, MeshModel* _m)
|
||||
{
|
||||
m=_m;
|
||||
changeMask=_mask;
|
||||
if(changeMask & MeshModel::MM_VERTCOLOR)
|
||||
{
|
||||
vertColor.resize(m->cm.vert.size());
|
||||
std::vector<vcg::Color4b>::iterator ci;
|
||||
CMeshO::VertexIterator vi;
|
||||
for(vi = m->cm.vert.begin(), ci = vertColor.begin(); vi != m->cm.vert.end(); ++vi, ++ci)
|
||||
if(!(*vi).IsD()) (*ci)=(*vi).C();
|
||||
}
|
||||
|
||||
if(changeMask & MeshModel::MM_VERTCOORD)
|
||||
{
|
||||
vertCoord.resize(m->cm.vert.size());
|
||||
std::vector<vcg::Point3f>::iterator ci;
|
||||
CMeshO::VertexIterator vi;
|
||||
for(vi = m->cm.vert.begin(), ci = vertCoord.begin(); vi != m->cm.vert.end(); ++vi, ++ci)
|
||||
if(!(*vi).IsD()) (*ci)=(*vi).P();
|
||||
}
|
||||
|
||||
if(changeMask & MeshModel::MM_VERTNORMAL)
|
||||
{
|
||||
vertNormal.resize(m->cm.vert.size());
|
||||
std::vector<vcg::Point3f>::iterator ci;
|
||||
CMeshO::VertexIterator vi;
|
||||
for(vi = m->cm.vert.begin(), ci = vertNormal.begin(); vi != m->cm.vert.end(); ++vi, ++ci)
|
||||
if(!(*vi).IsD()) (*ci)=(*vi).N();
|
||||
}
|
||||
|
||||
if(changeMask & MeshModel::MM_FACEFLAGSELECT)
|
||||
{
|
||||
faceSelection.resize(m->cm.face.size());
|
||||
std::vector<bool>::iterator ci;
|
||||
CMeshO::FaceIterator fi;
|
||||
for(fi = m->cm.face.begin(), ci = faceSelection.begin(); fi != m->cm.face.end(); ++fi, ++ci)
|
||||
if(!(*fi).IsD()) (*ci) = (*fi).IsS();
|
||||
}
|
||||
if(changeMask & MeshModel::MM_TRANSFMATRIX)
|
||||
Tr = m->cm.Tr;
|
||||
}
|
||||
|
||||
bool apply(MeshModel *_m)
|
||||
{
|
||||
if(_m != m) return false;
|
||||
if(changeMask & MeshModel::MM_VERTCOLOR)
|
||||
{
|
||||
if(vertColor.size() != m->cm.vert.size()) return false;
|
||||
std::vector<vcg::Color4b>::iterator ci;
|
||||
CMeshO::VertexIterator vi;
|
||||
for(vi = m->cm.vert.begin(), ci = vertColor.begin(); vi != m->cm.vert.end(); ++vi, ++ci)
|
||||
if(!(*vi).IsD()) (*vi).C()=(*ci);
|
||||
}
|
||||
|
||||
if(changeMask & MeshModel::MM_VERTCOORD)
|
||||
{
|
||||
if(vertCoord.size() != m->cm.vert.size()) return false;
|
||||
std::vector<vcg::Point3f>::iterator ci;
|
||||
CMeshO::VertexIterator vi;
|
||||
for(vi = m->cm.vert.begin(), ci = vertCoord.begin(); vi != m->cm.vert.end(); ++vi, ++ci)
|
||||
if(!(*vi).IsD()) (*vi).P()=(*ci);
|
||||
}
|
||||
|
||||
if(changeMask & MeshModel::MM_VERTNORMAL)
|
||||
{
|
||||
if(vertNormal.size() != m->cm.vert.size()) return false;
|
||||
std::vector<vcg::Point3f>::iterator ci;
|
||||
CMeshO::VertexIterator vi;
|
||||
for(vi = m->cm.vert.begin(), ci=vertNormal.begin(); vi != m->cm.vert.end(); ++vi, ++ci)
|
||||
if(!(*vi).IsD()) (*vi).N()=(*ci);
|
||||
|
||||
//now reset the face normals
|
||||
vcg::tri::UpdateNormals<CMeshO>::PerFaceNormalized(m->cm);
|
||||
}
|
||||
|
||||
if(changeMask & MeshModel::MM_FACEFLAGSELECT)
|
||||
{
|
||||
if(faceSelection.size() != m->cm.face.size()) return false;
|
||||
std::vector<bool>::iterator ci;
|
||||
CMeshO::FaceIterator fi;
|
||||
for(fi = m->cm.face.begin(), ci = faceSelection.begin(); fi != m->cm.face.end(); ++fi, ++ci)
|
||||
{
|
||||
if((*ci))
|
||||
(*fi).SetS();
|
||||
else
|
||||
(*fi).ClearS();
|
||||
}
|
||||
}
|
||||
|
||||
if(changeMask & MeshModel::MM_TRANSFMATRIX)
|
||||
m->cm.Tr=Tr;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void create(int _mask, MeshModel* _m);
|
||||
bool apply(MeshModel *_m);
|
||||
bool isValid(MeshModel *m);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user