refactoring and cleanups

This commit is contained in:
alemuntoni 2021-05-21 11:46:30 +02:00
parent e3a461470d
commit e4c83dea1e
79 changed files with 290 additions and 223 deletions

View File

@ -128,7 +128,7 @@ public:
* to MeshModel::updateDataMask(...)
*/
virtual int getRequirements(const QAction*) { return MeshModel::MM_NONE; }
/**
* @brief This function should require true if the glContext is used by the
* filter. Without this, the glContext will remain set to nullptr on non-GUI
@ -156,6 +156,20 @@ public:
*/
virtual int postCondition(const QAction*) const { return MeshModel::MM_ALL; }
/**
* @brief This function is called to initialized the list of parameters.
* If a filter does not need parameters, return an empty list and the framework
* will not create a dialog (unless for previewing)
*/
virtual RichParameterList initParameterList(const QAction*, const MeshModel &/*m*/)
{
return RichParameterList();
}
virtual RichParameterList initParameterList(const QAction* filter, const MeshDocument &md)
{
return initParameterList(filter, *(md.mm()));
}
/**
* @brief applies the selected filter with the already stabilished parameters
* This function is called by the framework after getting values for the parameters specified in the \ref initParameterList
@ -198,17 +212,6 @@ public:
*/
virtual FilterArity filterArity(const QAction *act) const = 0;
/**
* @brief This function is called to initialized the list of parameters.
* it is always called. If a filter does not need parameter it leave it empty and the framework
* will not create a dialog (unless for previewing)
*/
virtual void initParameterList(const QAction*, const MeshModel &/*m*/, RichParameterList & /*par*/) {}
virtual void initParameterList(const QAction* filter, const MeshDocument &md, RichParameterList &par)
{
initParameterList(filter, *(md.mm()), par);
}
virtual QString filterInfo(const QAction* a) const { return this->filterInfo(ID(a)); }
virtual QString filterName(const QAction* a) const { return this->filterName(ID(a)); }
virtual QString pythonFilterName(const QAction* a) const {return this->pythonFilterName(ID(a)); }

View File

@ -55,8 +55,7 @@ void pymeshlab::FunctionSet::loadFilterPlugin(FilterPlugin* fp)
QString pythonFilterName = fp->pythonFilterName(act);
Function f(pythonFilterName, originalFilterName, description);
RichParameterList rps;
fp->initParameterList(act, dummyMeshDocument, rps);
RichParameterList rps = fp->initParameterList(act, dummyMeshDocument);
for (const RichParameter& rp : rps){
FunctionParameter par(rp);

View File

@ -209,8 +209,7 @@ void FilterScriptDialog::editOldParameters( const int row )
//fill the parameter set with all the names and descriptions which are lost in the
//filter script
RichParameterList newParameterSet;
iFilter->initParameterList(action, *(mainWindow->meshDoc()), newParameterSet);
RichParameterList newParameterSet = iFilter->initParameterList(action, *(mainWindow->meshDoc()));
if(newParameterSet.size() == oldParameterSet.size()) {
RichParameterList::iterator i = newParameterSet.begin();

View File

@ -33,13 +33,12 @@ bool MeshlabStdDialog::showAutoDialog(FilterPlugin *mfi, MeshModel *mm, MeshDocu
curAction = action;
curmfi = mfi;
curmwi = mwi;
curParSet.clear();
prevParSet.clear();
curModel = mm;
curMeshDoc = mdp;
curgla = gla;
mfi->initParameterList(action, *mdp, curParSet);
curParSet = mfi->initParameterList(action, *mdp);
curmask = mfi->postCondition(action);
if (curParSet.isEmpty() && !isPreviewable()) return false;
@ -104,8 +103,7 @@ void MeshlabStdDialog::createFrame()
// update the values of the widgets with the values in the paramlist;
void MeshlabStdDialog::resetValues()
{
curParSet.clear();
curmfi->initParameterList(curAction, *curMeshDoc, curParSet);
curParSet = curmfi->initParameterList(curAction, *curMeshDoc);
assert(qf);
assert(qf->isVisible());

View File

@ -123,10 +123,11 @@ FilterPlugin::FilterClass AmbientOcclusionPlugin::getClass(const QAction * /*fil
//return MeshFilterInterface::FilterClass(MeshFilterInterface::FaceColoring | MeshFilterInterface::VertexColoring);
};
void AmbientOcclusionPlugin::initParameterList(const QAction *action, const MeshModel & /*m*/, RichParameterList &parlst)
RichParameterList AmbientOcclusionPlugin::initParameterList(const QAction *action, const MeshModel & /*m*/)
{
switch(ID(action))
{
RichParameterList parlst;
switch(ID(action))
{
case FP_AMBIENT_OCCLUSION:
parlst.addParam(RichEnum("occMode", 0, QStringList() << "per-Vertex" << "per-Face (deprecated)", tr("Occlusion mode:"), tr("Occlusion may be calculated per-vertex or per-face, color and quality will be saved in the chosen component.")));
parlst.addParam(RichFloat("dirBias",0,"Directional Bias [0..1]","The balance between a uniform and a directionally biased set of lighting direction<br>:"
@ -139,10 +140,12 @@ void AmbientOcclusionPlugin::initParameterList(const QAction *action, const Mesh
parlst.addParam(RichBool("useGPU",AMBOCC_USEGPU_BY_DEFAULT,"Use GPU acceleration","Only works for per-vertex AO. In order to use GPU-Mode, your hardware must support FBOs, FP32 Textures and Shaders. Normally increases the performance by a factor of 4x-5x"));
//parlst.addParam(RichBool("useVBO",AMBOCC_USEVBO_BY_DEFAULT,"Use VBO if supported","By using VBO, Meshlab loads all the vertex structure in the VRam, greatly increasing rendering speed (for both CPU and GPU mode). Disable it if problem occurs"));
parlst.addParam(RichInt ("depthTexSize",AMBOCC_DEFAULT_TEXTURE_SIZE,"Depth texture size(should be 2^n)", "Defines the depth texture size used to compute occlusion from each point of view. Higher values means better accuracy usually with low impact on performance"));
break;
break;
default: break; // do not add any parameter for the other filters
}
}
return parlst;
}
std::map<std::string, QVariant> AmbientOcclusionPlugin::applyFilter(const QAction * filter, const RichParameterList & par, MeshDocument &md, unsigned int& /*postConditionMask*/, vcg::CallBackPos *cb)
{
if (ID(filter) == FP_AMBIENT_OCCLUSION) {

View File

@ -76,7 +76,7 @@ public:
bool requiresGLContext(const QAction* action) const;
FilterClass getClass(const QAction* filter) const;
void initParameterList(const QAction*, const MeshModel &/*m*/, RichParameterList & /*parent*/);
RichParameterList initParameterList(const QAction*, const MeshModel &/*m*/);
std::map<std::string, QVariant> applyFilter(const QAction* action, const RichParameterList & /*parent*/, MeshDocument &md, unsigned int& postConditionMask, vcg::CallBackPos * cb);
void initTextures(void);
void initGL(vcg::CallBackPos *cb,unsigned int numVertices);

View File

@ -88,8 +88,9 @@ QString FilterCameraPlugin::filterInfo(ActionIDType filterId) const
}
// This function define the needed parameters for each filter.
void FilterCameraPlugin::initParameterList(const QAction *action, const MeshDocument &/*m*/, RichParameterList & parlst)
RichParameterList FilterCameraPlugin::initParameterList(const QAction *action, const MeshDocument &/*m*/)
{
RichParameterList parlst;
Shotm defShot;
switch(ID(action))
{
@ -181,6 +182,7 @@ void FilterCameraPlugin::initParameterList(const QAction *action, const MeshDocu
break;
default: break; // do not add any parameter for the other filters
}
return parlst;
}
// Core Function doing the actual mesh processing.

View File

@ -51,7 +51,7 @@ public:
virtual QString filterName(ActionIDType filter) const;
virtual QString filterInfo(ActionIDType filter) const;
virtual FilterClass getClass(const QAction*) const;
virtual void initParameterList(const QAction*, const MeshDocument &/*m*/, RichParameterList & /*parent*/);
virtual RichParameterList initParameterList(const QAction*, const MeshDocument &/*m*/);
std::map<std::string, QVariant> applyFilter(const QAction* action, const RichParameterList & /*parent*/, MeshDocument &md, unsigned int& postConditionMask, vcg::CallBackPos * cb);
FilterArity filterArity(const QAction* act) const;
};

View File

@ -223,8 +223,9 @@ int CleanFilter::postCondition(const QAction* action) const
return MeshModel::MM_ALL;
}
void CleanFilter::initParameterList(const QAction *action, const MeshDocument &md, RichParameterList & parlst)
RichParameterList CleanFilter::initParameterList(const QAction *action, const MeshDocument &md)
{
RichParameterList parlst;
pair<float,float> qualityRange;
switch(ID(action))
{
@ -268,6 +269,7 @@ void CleanFilter::initParameterList(const QAction *action, const MeshDocument &m
break;
default: break; // do not add any parameter for the other filters
}
return parlst;
}
std::map<std::string, QVariant> CleanFilter::applyFilter(const QAction *filter, const RichParameterList & par, MeshDocument &md, unsigned int& postConditionMask, vcg::CallBackPos * cb)

View File

@ -64,14 +64,14 @@ class CleanFilter : public QObject, public FilterPlugin
~CleanFilter();
QString pluginName() const;
virtual QString filterName(ActionIDType filter) const;
virtual QString filterInfo(ActionIDType filter) const;
QString filterName(ActionIDType filter) const;
QString filterInfo(ActionIDType filter) const;
virtual FilterClass getClass(const QAction*) const;
virtual int getRequirements(const QAction*);
FilterClass getClass(const QAction*) const;
int getRequirements(const QAction*);
int postCondition(const QAction* ) const;
int getPreConditions(const QAction *) const { return MeshModel::MM_NONE; }
virtual void initParameterList(const QAction*, const MeshDocument &/*m*/, RichParameterList & /*parent*/);
RichParameterList initParameterList(const QAction*, const MeshDocument &/*m*/);
std::map<std::string, QVariant> applyFilter(const QAction* action, const RichParameterList & /*parent*/, MeshDocument &md, unsigned int& postConditionMask, vcg::CallBackPos * cb);
FilterArity filterArity(const QAction *) const {return SINGLE_MESH;}
};

View File

@ -122,8 +122,9 @@ bool FilterColorProjectionPlugin::requiresGLContext(const QAction* action) const
// This function define the needed parameters for each filter.
void FilterColorProjectionPlugin::initParameterList(const QAction *action, const MeshDocument &md, RichParameterList & parlst)
RichParameterList FilterColorProjectionPlugin::initParameterList(const QAction *action, const MeshDocument &md)
{
RichParameterList parlst;
switch(ID(action))
{
case FP_SINGLEIMAGEPROJ :
@ -229,6 +230,7 @@ void FilterColorProjectionPlugin::initParameterList(const QAction *action, const
default: break; // do not add any parameter for the other filters
}
return parlst;
}
// Core Function doing the actual mesh processing.

View File

@ -44,7 +44,7 @@ class FilterColorProjectionPlugin : public QObject, public FilterPlugin
int postCondition( const QAction* ) const;
FilterClass getClass(const QAction*) const;
void initParameterList(const QAction*, const MeshDocument &/*m*/, RichParameterList & /*parent*/);
RichParameterList initParameterList(const QAction*, const MeshDocument &/*m*/);
int getRequirements(const QAction*);
bool requiresGLContext(const QAction* action) const;
std::map<std::string, QVariant> applyFilter(const QAction* action, const RichParameterList & /*parent*/, MeshDocument &md, unsigned int& postConditionMask, vcg::CallBackPos * cb);

View File

@ -189,8 +189,9 @@ int FilterColorProc::getRequirements(const QAction *action)
assert(0);
}
void FilterColorProc::initParameterList(const QAction *a, const MeshDocument& md, RichParameterList & par)
RichParameterList FilterColorProc::initParameterList(const QAction *a, const MeshDocument& md)
{
RichParameterList par;
switch(ID(a))
{
case CP_FILLING:
@ -380,6 +381,7 @@ void FilterColorProc::initParameterList(const QAction *a, const MeshDocument& md
default: break; // do not add any parameter for the other filters
}
return par;
}
std::map<std::string, QVariant> FilterColorProc::applyFilter(const QAction *filter, const RichParameterList &par, MeshDocument &md, unsigned int& /*postConditionMask*/, vcg::CallBackPos *cb)

View File

@ -77,7 +77,7 @@ public:
virtual int getRequirements(const QAction*);
virtual void initParameterList(const QAction*, const MeshDocument&, RichParameterList & /*parent*/);
virtual RichParameterList initParameterList(const QAction*, const MeshDocument&);
std::map<std::string, QVariant> applyFilter(const QAction* action, const RichParameterList & /*parent*/, MeshDocument &md, unsigned int& postConditionMask, vcg::CallBackPos * cb);
int postCondition(const QAction* filter) const;
int getPreConditions(const QAction *) const;

View File

@ -108,8 +108,9 @@ QString FilterCreate::filterInfo(ActionIDType filterId) const
// - the string shown in the dialog
// - the default value
// - a possibly long string describing the meaning of that parameter (shown as a popup help in the dialog)
void FilterCreate::initParameterList(const QAction *action, const MeshModel & /*m*/, RichParameterList & parlst)
RichParameterList FilterCreate::initParameterList(const QAction *action, const MeshModel & /*m*/)
{
RichParameterList parlst;
switch(ID(action)) {
case CR_SPHERE :
@ -172,8 +173,10 @@ void FilterCreate::initParameterList(const QAction *action, const MeshModel & /*
"<b>-- Parallel</b>: The fitting plane will be oriented with a side parallel with the chosen plane. WARNING: do not use if the selection is exactly parallel to a plane.<br>"
)));
break;
default : return;
default :
assert(0);
}
return parlst;
}
// The Real Core Function doing the actual mesh processing.

View File

@ -53,7 +53,7 @@ public:
QString filterName(ActionIDType filter) const;
QString filterInfo(ActionIDType filter) const;
FilterClass getClass(const QAction*) const;
void initParameterList(const QAction*, const MeshModel &/*m*/, RichParameterList & /*parent*/);
RichParameterList initParameterList(const QAction*, const MeshModel &/*m*/);
std::map<std::string, QVariant> applyFilter(const QAction* action, const RichParameterList & /*parent*/, MeshDocument &md, unsigned int& postConditionMask, vcg::CallBackPos * cb);
QString filterScriptFunctionName(ActionIDType filterID);
FilterArity filterArity(const QAction *) const {return NONE;}

View File

@ -124,8 +124,10 @@ std::map<std::string, QVariant> FilterCreateIso::applyFilter(const QAction *filt
}
return std::map<std::string, QVariant>();
}
void FilterCreateIso::initParameterList(const QAction *action, const MeshModel & /*m*/, RichParameterList & parlst)
RichParameterList FilterCreateIso::initParameterList(const QAction *action, const MeshModel & /*m*/)
{
RichParameterList parlst;
switch(ID(action))
{
case FP_CREATEISO :
@ -133,6 +135,7 @@ void FilterCreateIso::initParameterList(const QAction *action, const MeshModel &
break;
default: break; // do not add any parameter for the other filters
}
return parlst;
}

View File

@ -56,12 +56,12 @@ class FilterCreateIso : public QObject, public FilterPlugin
~FilterCreateIso();
QString pluginName() const;
virtual QString filterName(ActionIDType filter) const;
virtual QString filterInfo(ActionIDType filter) const;
QString filterName(ActionIDType filter) const;
QString filterInfo(ActionIDType filter) const;
virtual FilterClass getClass(const QAction*) const;
virtual int getRequirements(const QAction*);
virtual void initParameterList(const QAction*, const MeshModel &/*m*/, RichParameterList & /*parent*/);
FilterClass getClass(const QAction*) const;
int getRequirements(const QAction*);
RichParameterList initParameterList(const QAction*, const MeshModel &/*m*/);
std::map<std::string, QVariant> applyFilter(const QAction* action, const RichParameterList & /*parent*/, MeshDocument &md, unsigned int& postConditionMask, vcg::CallBackPos * cb);
FilterArity filterArity(const QAction*) const {return NONE;}

View File

@ -74,8 +74,9 @@ QString FilterCSG::filterInfo(ActionIDType filterId) const
}
}
void FilterCSG::initParameterList(const QAction *action, const MeshDocument & md, RichParameterList & parlst)
RichParameterList FilterCSG::initParameterList(const QAction *action, const MeshDocument & md)
{
RichParameterList parlst;
switch (ID(action)) {
case FP_CSG:
{
@ -114,6 +115,7 @@ void FilterCSG::initParameterList(const QAction *action, const MeshDocument & md
default:
assert(0);
}
return parlst;
}
std::map<std::string, QVariant> FilterCSG::applyFilter(const QAction *filter, const RichParameterList & par, MeshDocument &md, unsigned int& /*postConditionMask*/, vcg::CallBackPos *cb)

View File

@ -53,16 +53,16 @@ public:
~FilterCSG() {};
QString pluginName() const;
virtual QString filterName(ActionIDType filter) const;
virtual QString filterInfo(ActionIDType filter) const;
QString filterName(ActionIDType filter) const;
QString filterInfo(ActionIDType filter) const;
virtual bool autoDialog(QAction *) { return true; }
bool autoDialog(QAction *) { return true; }
virtual void initParameterList(const QAction*, const MeshDocument &, RichParameterList &);
RichParameterList initParameterList(const QAction*, const MeshDocument &);
std::map<std::string, QVariant> applyFilter(const QAction* action, const RichParameterList & /*parent*/, MeshDocument &md, unsigned int& postConditionMask, vcg::CallBackPos * cb);
virtual FilterClass getClass(const QAction *) const { return FilterPlugin::FilterClass( FilterPlugin::Layer + FilterPlugin::Remeshing ); }
FilterClass getClass(const QAction *) const { return FilterPlugin::FilterClass( FilterPlugin::Layer + FilterPlugin::Remeshing ); }
FilterArity filterArity(const QAction*) const {return FIXED;}
};

View File

@ -99,8 +99,9 @@ QString FilterDirt::filterInfo(ActionIDType filterId) const
}
}
void FilterDirt::initParameterList(const QAction* filter, const MeshDocument & /*md*/, RichParameterList &par){
RichParameterList FilterDirt::initParameterList(const QAction* filter, const MeshDocument & /*md*/)
{
RichParameterList par;
switch(ID(filter)){
case FP_DIRT:{
@ -126,6 +127,7 @@ void FilterDirt::initParameterList(const QAction* filter, const MeshDocument & /
break;
}
}
return par;
}
int FilterDirt::getRequirements(const QAction * /*action*/)

View File

@ -64,7 +64,7 @@ public:
virtual int getRequirements(const QAction*);
virtual bool autoDialog(QAction *) {return true;}
// virtual void initParameterSet(QAction* filter,MeshModel &,RichParameterSet &){};
virtual void initParameterList(const QAction*, const MeshDocument &/*m*/, RichParameterList & /*parent*/);
RichParameterList initParameterList(const QAction*, const MeshDocument &/*m*/);
std::map<std::string, QVariant> applyFilter(const QAction* action, const RichParameterList & /*parent*/, MeshDocument &md, unsigned int& postConditionMask, vcg::CallBackPos * cb);
virtual int postCondition(const QAction*) const;
virtual FilterClass getClass (const QAction *) const;

View File

@ -169,8 +169,9 @@ QString FilterFractal::filterInfo(ActionIDType filterId) const
return description;
}
void FilterFractal::initParameterList(const QAction* filter, const MeshDocument &md, RichParameterList &par)
RichParameterList FilterFractal::initParameterList(const QAction* filter, const MeshDocument &md)
{
RichParameterList par;
switch(ID(filter))
{
case CR_FRACTAL_TERRAIN:
@ -181,6 +182,7 @@ void FilterFractal::initParameterList(const QAction* filter, const MeshDocument
initParameterSetForCratersGeneration(md, par);
break;
}
return par;
}
void FilterFractal::initParameterSetForFractalDisplacement(const QAction *filter, const MeshDocument &md, RichParameterList &par)

View File

@ -46,7 +46,7 @@ class FilterFractal : public QObject, public FilterPlugin
QString filterInfo(ActionIDType filter) const;
int getRequirements(const QAction*);
void initParameterList(const QAction*, const MeshDocument &, RichParameterList &);
RichParameterList initParameterList(const QAction*, const MeshDocument &);
std::map<std::string, QVariant> applyFilter(const QAction* action, const RichParameterList & /*parent*/, MeshDocument &md, unsigned int& postConditionMask, vcg::CallBackPos * cb);
int postCondition(const QAction *action) const;

View File

@ -254,9 +254,9 @@ int FilterFunctionPlugin::getRequirements(const QAction *action)
// - the string shown in the dialog
// - the default value
// - a possibly long string describing the meaning of that parameter (shown as a popup help in the dialog)
void FilterFunctionPlugin::initParameterList(const QAction *action,const MeshModel &m, RichParameterList & parlst)
RichParameterList FilterFunctionPlugin::initParameterList(const QAction *action,const MeshModel &)
{
Q_UNUSED(m);
RichParameterList parlst;
switch(ID(action)) {
case FF_VERT_SELECTION :
@ -369,6 +369,7 @@ void FilterFunctionPlugin::initParameterList(const QAction *action,const MeshMod
default: break; // do not add any parameter for the other filters
}
return parlst;
}
// The Real Core Function doing the actual mesh processing.

View File

@ -76,11 +76,11 @@ public:
~FilterFunctionPlugin();
QString pluginName() const;
virtual QString filterName(ActionIDType filter) const;
virtual QString filterInfo(ActionIDType filter) const;
virtual FilterClass getClass(const QAction*) const;
virtual int postCondition(const QAction *action) const;
virtual void initParameterList(const QAction*, const MeshModel &/*m*/, RichParameterList & /*parent*/);
QString filterName(ActionIDType filter) const;
QString filterInfo(ActionIDType filter) const;
FilterClass getClass(const QAction*) const;
int postCondition(const QAction *action) const;
RichParameterList initParameterList(const QAction*, const MeshModel &/*m*/);
virtual int getRequirements(const QAction*);
std::map<std::string, QVariant> applyFilter(
const QAction* action,

View File

@ -232,8 +232,9 @@ std::map<std::string, QVariant> FilterGeodesic::applyFilter(const QAction *filte
return std::map<std::string, QVariant>();
}
void FilterGeodesic::initParameterList(const QAction *action, const MeshModel &m, RichParameterList & parlst)
RichParameterList FilterGeodesic::initParameterList(const QAction *action, const MeshModel &m)
{
RichParameterList parlst;
switch(ID(action))
{
case FP_QUALITY_POINT_GEODESIC :
@ -245,7 +246,7 @@ void FilterGeodesic::initParameterList(const QAction *action, const MeshModel &m
break;
default: break; // do not add any parameter for the other filters
}
return;
return parlst;
}
int FilterGeodesic::postCondition(const QAction * filter) const

View File

@ -57,7 +57,7 @@ class FilterGeodesic : public QObject, public FilterPlugin
FilterClass getClass(const QAction*) const;
int getRequirements(const QAction*);
std::map<std::string, QVariant> applyFilter(const QAction* action, const RichParameterList & /*parent*/, MeshDocument &md, unsigned int& postConditionMask, vcg::CallBackPos * cb);
void initParameterList(const QAction*, const MeshModel &/*m*/, RichParameterList & /*parent*/);
RichParameterList initParameterList(const QAction*, const MeshModel &/*m*/);
int postCondition(const QAction * filter) const;
FilterArity filterArity(const QAction*) const {return SINGLE_MESH;}
};

View File

@ -140,11 +140,11 @@ FilterPlugin::FilterClass FilterImgPatchParamPlugin::getClass(const QAction *act
//}
void FilterImgPatchParamPlugin::initParameterList(
RichParameterList FilterImgPatchParamPlugin::initParameterList(
const QAction *act,
const MeshDocument &/*md*/,
RichParameterList &par )
const MeshDocument &/*md*/)
{
RichParameterList par;
switch( ID(act) )
{
case FP_PATCH_PARAM_AND_TEXTURING:
@ -204,6 +204,7 @@ void FilterImgPatchParamPlugin::initParameterList(
break;
}
}
return par;
}

View File

@ -109,17 +109,16 @@ public:
~FilterImgPatchParamPlugin();
QString pluginName() const;
virtual QString filterName( ActionIDType id ) const;
virtual QString filterInfo( ActionIDType id ) const;
QString filterName( ActionIDType id ) const;
QString filterInfo( ActionIDType id ) const;
virtual FilterClass getClass(const QAction* act ) const;
FilterClass getClass(const QAction* act ) const;
virtual void initParameterList(
RichParameterList initParameterList(
const QAction* act,
const MeshDocument &md,
RichParameterList &par );
const MeshDocument &md);
virtual int getRequirements(const QAction* act );
int getRequirements(const QAction* act );
bool requiresGLContext(const QAction* action) const;
//virtual int postCondition( QAction *act ) const;

View File

@ -99,9 +99,9 @@ int FilterIsoParametrization::getRequirements(const QAction *)
return MeshModel::MM_NONE;
}
void FilterIsoParametrization::initParameterList(const QAction *a, const MeshDocument& md, RichParameterList & par)
RichParameterList FilterIsoParametrization::initParameterList(const QAction *a, const MeshDocument& md)
{
RichParameterList par;
switch(ID(a))
{
case ISOP_PARAM:
@ -157,6 +157,7 @@ void FilterIsoParametrization::initParameterList(const QAction *a, const MeshDoc
par.addParam(RichMesh ("targetMesh",md.mm()->id(),&md, "Target Mesh", "The mesh to be Isoparameterized"));
}
}
return par;
}
void FilterIsoParametrization::PrintStats(CMeshO *mesh)

View File

@ -54,7 +54,7 @@ public:
virtual int getRequirements(const QAction*);
virtual void initParameterList(const QAction*, const MeshDocument&, RichParameterList & /*parent*/);
RichParameterList initParameterList(const QAction*, const MeshDocument&);
std::map<std::string, QVariant> applyFilter(
const QAction* action,
const RichParameterList & parameters,

View File

@ -116,8 +116,9 @@ QString FilterLayerPlugin::filterInfo(ActionIDType filterId) const
}
// This function define the needed parameters for each filter.
void FilterLayerPlugin::initParameterList(const QAction *action, const MeshDocument &md, RichParameterList & parlst)
RichParameterList FilterLayerPlugin::initParameterList(const QAction *action, const MeshDocument &md)
{
RichParameterList parlst;
const MeshModel *mm=md.mm();
const RasterModel *rm=md.rm();
switch(ID(action))
@ -178,6 +179,7 @@ void FilterLayerPlugin::initParameterList(const QAction *action, const MeshDocum
break;
default: break; // do not add any parameter for the other filters
}
return parlst;
}
// Core Function doing the actual mesh processing.

View File

@ -56,10 +56,10 @@ public:
FilterLayerPlugin();
QString pluginName() const;
virtual QString filterName(ActionIDType filter) const;
virtual QString filterInfo(ActionIDType filter) const;
virtual FilterClass getClass(const QAction*) const;
virtual void initParameterList(const QAction*, const MeshDocument &/*m*/, RichParameterList & /*parent*/);
QString filterName(ActionIDType filter) const;
QString filterInfo(ActionIDType filter) const;
FilterClass getClass(const QAction*) const;
RichParameterList initParameterList(const QAction*, const MeshDocument &/*m*/);
std::map<std::string, QVariant> applyFilter(
const QAction* action,
const RichParameterList & parameters,

View File

@ -155,8 +155,9 @@ int FilterMeasurePlugin::getPreConditions(const QAction* action) const
}
}
void FilterMeasurePlugin::initParameterList(const QAction *action, const MeshModel &m, RichParameterList & parlst)
RichParameterList FilterMeasurePlugin::initParameterList(const QAction *action, const MeshModel &m)
{
RichParameterList parlst;
switch (ID(action)) {
case PER_VERTEX_QUALITY_HISTOGRAM:
parlst.addParam(RichFloat("HistMin", vcg::tri::Stat<CMeshO>::ComputePerVertexQualityMinMax(m.cm).first, "Hist Min", "The vertex are displaced of a vector whose norm is bounded by this value"));
@ -173,6 +174,7 @@ void FilterMeasurePlugin::initParameterList(const QAction *action, const MeshMod
default:
break;
}
return parlst;
}
std::map<std::string, QVariant> FilterMeasurePlugin::applyFilter(

View File

@ -53,7 +53,7 @@ public:
FilterClass getClass(const QAction*) const;
FilterArity filterArity(const QAction*) const;
int getPreConditions(const QAction *action) const;
void initParameterList(const QAction* , const MeshModel& m, RichParameterList& parlst);
RichParameterList initParameterList(const QAction* , const MeshModel& m);
std::map<std::string, QVariant> applyFilter(
const QAction* action,
const RichParameterList & parameters,

View File

@ -350,8 +350,9 @@ QString ExtraMeshFilterPlugin::filterInfo(ActionIDType filterID) const
// return
// true if has some parameters
// false is has no params
void ExtraMeshFilterPlugin::initParameterList(const QAction * action, const MeshModel & m, RichParameterList & parlst)
RichParameterList ExtraMeshFilterPlugin::initParameterList(const QAction * action, const MeshModel & m)
{
RichParameterList parlst;
float maxVal;
QStringList curvCalcMethods;
QStringList curvColorMethods;
@ -642,6 +643,7 @@ void ExtraMeshFilterPlugin::initParameterList(const QAction * action, const Mesh
default:
break;
}
return parlst;
}

View File

@ -88,7 +88,7 @@ public:
QString filterInfo(ActionIDType filter) const;
FilterClass getClass(const QAction*) const;
void initParameterList(const QAction*, const MeshModel &/*m*/, RichParameterList & /*parent*/);
RichParameterList initParameterList(const QAction*, const MeshModel &/*m*/);
std::map<std::string, QVariant> applyFilter(
const QAction* action,
const RichParameterList & parameters,

View File

@ -179,8 +179,9 @@ QString MlsPlugin::filterInfo(ActionIDType filterId) const
// - the string shown in the dialog
// - the default value
// - a possibly long string describing the meaning of that parameter (shown as a popup help in the dialog)
void MlsPlugin::initParameterList(const QAction* action, const MeshDocument& md, RichParameterList& parlst)
RichParameterList MlsPlugin::initParameterList(const QAction* action, const MeshDocument& md)
{
RichParameterList parlst;
int id = ID(action);
const MeshModel *target = md.mm();
@ -195,7 +196,7 @@ void MlsPlugin::initParameterList(const QAction* action, const MeshDocument& md,
false,
"Select only non closed components",
""));
return;
return parlst;
}
else if (id == FP_RADIUS_FROM_DENSITY)
{
@ -203,7 +204,7 @@ void MlsPlugin::initParameterList(const QAction* action, const MeshDocument& md,
16,
"Number of neighbors",
"Number of neighbors used to estimate the local density. Larger values lead to smoother variations."));
return;
return parlst;
}
if ((id & _PROJECTION_))
@ -313,6 +314,7 @@ void MlsPlugin::initParameterList(const QAction* action, const MeshDocument& md,
"The resolution of the grid on which we run the marching cubes."
"This marching cube is memory friendly, so you can safely set large values up to 1000 or even more."));
}
return parlst;
}
int MlsPlugin::getRequirements(const QAction *)

View File

@ -63,11 +63,11 @@ public:
MlsPlugin();
QString pluginName() const;
virtual QString filterName(ActionIDType filter) const;
virtual QString filterInfo(ActionIDType filter) const;
QString filterName(ActionIDType filter) const;
QString filterInfo(ActionIDType filter) const;
FilterClass getClass(const QAction *a) const;
virtual void initParameterList(const QAction*, const MeshDocument &md, RichParameterList &parent);
virtual int getRequirements(const QAction* action);
RichParameterList initParameterList(const QAction*, const MeshDocument &md);
int getRequirements(const QAction* action);
std::map<std::string, QVariant> applyFilter(
const QAction* action,
const RichParameterList & parameters,

View File

@ -114,8 +114,9 @@ bool FilterMutualGlobal::requiresGLContext(const QAction* action) const
// - the string shown in the dialog
// - the default value
// - a possibly long string describing the meaning of that parameter (shown as a popup help in the dialog)
void FilterMutualGlobal::initParameterList(const QAction *action, const MeshDocument & md, RichParameterList & parlst)
RichParameterList FilterMutualGlobal::initParameterList(const QAction *action, const MeshDocument &)
{
RichParameterList parlst;
QStringList rendList;
switch(ID(action)) {
case FP_IMAGE_GLOBALIGN :
@ -167,6 +168,7 @@ void FilterMutualGlobal::initParameterList(const QAction *action, const MeshDocu
default : assert(0);
}
return parlst;
}
// The Real Core Function doing the actual mesh processing.

View File

@ -54,7 +54,7 @@ public:
QString filterName(ActionIDType filter) const;
QString filterInfo(ActionIDType filter) const;
void initParameterList(const QAction*, const MeshDocument & md, RichParameterList & /*parent*/);
RichParameterList initParameterList(const QAction*, const MeshDocument & md);
std::map<std::string, QVariant> applyFilter(
const QAction* action,
const RichParameterList & parameters,

View File

@ -96,8 +96,9 @@ FilterPlugin::FilterArity FilterMutualInfoPlugin::filterArity(const QAction*) co
return SINGLE_MESH;
}
void FilterMutualInfoPlugin::initParameterList(const QAction *action, const MeshDocument & /*md*/, RichParameterList & parlst)
RichParameterList FilterMutualInfoPlugin::initParameterList(const QAction *action, const MeshDocument & /*md*/)
{
RichParameterList parlst;
QStringList rendList;
rendList.push_back("Combined");
rendList.push_back("Normal map");
@ -119,6 +120,7 @@ void FilterMutualInfoPlugin::initParameterList(const QAction *action, const Mesh
default :
assert(0);
}
return parlst;
}
std::map<std::string, QVariant> FilterMutualInfoPlugin::applyFilter(

View File

@ -48,7 +48,7 @@ public:
FilterClass getClass(const QAction* a) const;
bool requiresGLContext(const QAction* action) const;
FilterArity filterArity(const QAction*) const;
void initParameterList(const QAction*, const MeshDocument &, RichParameterList & /*parent*/);
RichParameterList initParameterList(const QAction*, const MeshDocument &);
std::map<std::string, QVariant> applyFilter(
const QAction* action,
const RichParameterList & parameters,

View File

@ -101,8 +101,9 @@ PlyMCPlugin::FilterClass PlyMCPlugin::getClass(const QAction *a) const
// - the string shown in the dialog
// - the default value
// - a possibly long string describing the meaning of that parameter (shown as a popup help in the dialog)
void PlyMCPlugin::initParameterList(const QAction *action,const MeshModel &m, RichParameterList & parlst)
RichParameterList PlyMCPlugin::initParameterList(const QAction *action,const MeshModel &m)
{
RichParameterList parlst;
switch(ID(action))
{
case FP_PLYMC :
@ -120,6 +121,7 @@ void PlyMCPlugin::initParameterList(const QAction *action,const MeshModel &m, Ri
break;
default: break; // do not add any parameter for the other filters
}
return parlst;
}
// The Real Core Function doing the actual mesh processing.

View File

@ -43,7 +43,7 @@ public:
QString pluginName() const;
virtual QString filterName(ActionIDType filter) const;
virtual QString filterInfo(ActionIDType filter) const;
virtual void initParameterList(const QAction*, const MeshModel &/*m*/, RichParameterList & /*parent*/);
virtual RichParameterList initParameterList(const QAction*, const MeshModel &/*m*/);
std::map<std::string, QVariant> applyFilter(
const QAction* action,
const RichParameterList & parameters,

View File

@ -135,8 +135,9 @@ QhullPlugin::FilterClass QhullPlugin::getClass(const QAction *a) const
// - the string shown in the dialog
// - the default value
// - a possibly long string describing the meaning of that parameter (shown as a popup help in the dialog)
void QhullPlugin::initParameterList(const QAction *action,const MeshModel &m, RichParameterList & parlst)
RichParameterList QhullPlugin::initParameterList(const QAction *action,const MeshModel &m)
{
RichParameterList parlst;
switch(ID(action)) {
case FP_QHULL_CONVEX_HULL :
{
@ -195,6 +196,7 @@ void QhullPlugin::initParameterList(const QAction *action,const MeshModel &m, Ri
}
default: break; // do not add any parameter for the other filters
}
return parlst;
}
// The Real Core Function doing the actual mesh processing.

View File

@ -56,16 +56,16 @@ public:
~QhullPlugin();
QString pluginName() const;
virtual QString filterName(ActionIDType filter) const;
virtual QString filterInfo(ActionIDType filter) const;
virtual void initParameterList(const QAction*, const MeshModel &/*m*/, RichParameterList & /*parent*/);
QString filterName(ActionIDType filter) const;
QString filterInfo(ActionIDType filter) const;
RichParameterList initParameterList(const QAction*, const MeshModel &/*m*/);
std::map<std::string, QVariant> applyFilter(
const QAction* action,
const RichParameterList & parameters,
MeshDocument &md,
unsigned int& postConditionMask,
vcg::CallBackPos * cb);
virtual FilterClass getClass(const QAction*) const;
FilterClass getClass(const QAction*) const;
FilterArity filterArity(const QAction *) const {return SINGLE_MESH;}
};

View File

@ -86,8 +86,9 @@ FilterPlugin::FilterClass QualityMapperFilter::getClass(const QAction *a) const
// - the string shown in the dialog
// - the default value
// - a possibly long string describing the meaning of that parameter (shown as a popup help in the dialog)
void QualityMapperFilter::initParameterList(const QAction *action,const MeshModel &m, RichParameterList & parlst)
RichParameterList QualityMapperFilter::initParameterList(const QAction *action,const MeshModel &m)
{
RichParameterList parlst;
switch(ID(action)) {
case FP_QUALITY_MAPPER :
{
@ -121,6 +122,7 @@ void QualityMapperFilter::initParameterList(const QAction *action,const MeshMode
break;
default: break; // do not add any parameter for the other filters
}
return parlst;
}
// The Real Core Function doing the actual mesh processing.

View File

@ -70,11 +70,11 @@ public:
QualityMapperFilter();
QString pluginName() const;
virtual QString filterName(ActionIDType filter) const;
virtual QString filterInfo(ActionIDType filter) const;
QString filterName(ActionIDType filter) const;
QString filterInfo(ActionIDType filter) const;
int getPreConditions(const QAction *) const;
int postCondition(const QAction* ) const;
virtual void initParameterList(const QAction*, const MeshModel &/*m*/, RichParameterList & /*parent*/);
RichParameterList initParameterList(const QAction*, const MeshModel &/*m*/);
std::map<std::string, QVariant> applyFilter(
const QAction* action,
const RichParameterList & parameters,

View File

@ -138,8 +138,9 @@ int FilterSamplePlugin::postCondition(const QAction*) const
* @param m
* @param parlst
*/
void FilterSamplePlugin::initParameterList(const QAction *action,const MeshModel &m, RichParameterList & parlst)
RichParameterList FilterSamplePlugin::initParameterList(const QAction *action,const MeshModel &m)
{
RichParameterList parlst;
switch(ID(action)) {
case FP_MOVE_VERTEX :
parlst.addParam(RichBool ("UpdateNormals", true, "Recompute normals", "Toggle the recomputation of the normals after the random displacement.\n\nIf disabled the face normals will remains unchanged resulting in a visually pleasant effect."));
@ -148,6 +149,7 @@ void FilterSamplePlugin::initParameterList(const QAction *action,const MeshModel
default :
assert(0);
}
return parlst;
}
/**

View File

@ -61,7 +61,7 @@ public:
FilterArity filterArity(const QAction*) const;
int getPreConditions(const QAction *) const;
int postCondition(const QAction* ) const;
void initParameterList(const QAction*, const MeshModel &/*m*/, RichParameterList & /*parent*/);
RichParameterList initParameterList(const QAction*, const MeshModel &/*m*/);
std::map<std::string, QVariant> applyFilter(
const QAction* action,
const RichParameterList & parameters,

View File

@ -96,8 +96,9 @@ FilterPlugin::FilterClass ExtraSampleDynPlugin::getClass(const QAction *) const
// when the user press apply the current stored state is updated.
// when the user press close the mesh state is restored to the one before the startup of the filter.
void ExtraSampleDynPlugin::initParameterList(const QAction *action,const MeshModel &/*m*/, RichParameterList & parlst)
RichParameterList ExtraSampleDynPlugin::initParameterList(const QAction *action,const MeshModel &/*m*/)
{
RichParameterList parlst;
switch(ID(action)) {
case FP_VERTEX_COLOR_NOISE :
parlst.addParam(RichColor ("baseColor",
@ -118,6 +119,7 @@ void ExtraSampleDynPlugin::initParameterList(const QAction *action,const MeshMod
default: break; // do not add any parameter for the other filters
}
return parlst;
}
// The Real Core Function doing the actual mesh processing.

View File

@ -41,12 +41,12 @@ class ExtraSampleDynPlugin : public QObject, public FilterPlugin
virtual ~ExtraSampleDynPlugin();
QString pluginName() const;
virtual QString filterName(ActionIDType filter) const;
virtual QString filterInfo(ActionIDType filter) const;
virtual void initParameterList(const QAction*, const MeshModel &/*m*/, RichParameterList & /*parent*/);
virtual int postCondition(const QAction* ) const {return MeshModel::MM_VERTCOLOR;};
QString filterName(ActionIDType filter) const;
QString filterInfo(ActionIDType filter) const;
RichParameterList initParameterList(const QAction*, const MeshModel &/*m*/);
int postCondition(const QAction* ) const {return MeshModel::MM_VERTCOLOR;};
std::map<std::string, QVariant> applyFilter(const QAction* action, const RichParameterList & /*parent*/, MeshDocument &md, unsigned int& postConditionMask, vcg::CallBackPos * cb);
virtual FilterClass getClass(const QAction*) const;
FilterClass getClass(const QAction*) const;
FilterArity filterArity(const QAction *) const {return SINGLE_MESH;}
};

View File

@ -107,10 +107,9 @@ ExtraSampleGPUPlugin::FilterClass ExtraSampleGPUPlugin::getClass(const QAction *
// - the string shown in the dialog
// - the default value
// - a possibly long string describing the meaning of that parameter (shown as a popup help in the dialog)
void ExtraSampleGPUPlugin::initParameterList(const QAction * action, const MeshModel & m, RichParameterList & parlst)
RichParameterList ExtraSampleGPUPlugin::initParameterList(const QAction * action, const MeshModel &)
{
(void)m;
RichParameterList parlst;
switch(ID(action))
{
case FP_GPU_EXAMPLE :
@ -124,6 +123,7 @@ void ExtraSampleGPUPlugin::initParameterList(const QAction * action, const MeshM
}
default : assert(0);
}
return parlst;
}
// The Real Core Function doing the actual mesh processing.

View File

@ -49,9 +49,9 @@ public:
ExtraSampleGPUPlugin();
QString pluginName() const;
FilterArity filterArity(const QAction *) const {return SINGLE_MESH;}
void initParameterList(const QAction* action, const MeshModel &m, RichParameterList & parlst);
QString pluginName() const;
FilterArity filterArity(const QAction *) const {return SINGLE_MESH;}
RichParameterList initParameterList(const QAction* action, const MeshModel &m);
QString filterName(ActionIDType filter) const;
QString pythonFilterName(ActionIDType filterId) const;

View File

@ -462,8 +462,9 @@ int FilterDocSampling::getRequirements(const QAction *action)
// - the string shown in the dialog
// - the default value
// - a possibly long string describing the meaning of that parameter (shown as a popup help in the dialog)
void FilterDocSampling::initParameterList(const QAction *action, const MeshDocument & md, RichParameterList & parlst)
RichParameterList FilterDocSampling::initParameterList(const QAction *action, const MeshDocument & md)
{
RichParameterList parlst;
switch(ID(action)) {
case FP_MONTECARLO_SAMPLING :
parlst.addParam(RichInt ("SampleNum", md.mm()->cm.vn,
@ -696,6 +697,7 @@ void FilterDocSampling::initParameterList(const QAction *action, const MeshDocum
} break;
default: break; // do not add any parameter for the other filters
}
return parlst;
}
std::map<std::string, QVariant> FilterDocSampling::applyFilter(

View File

@ -54,7 +54,7 @@ public:
QString pluginName() const;
QString filterName(ActionIDType filter) const;
QString filterInfo(ActionIDType filter) const;
void initParameterList(const QAction*, const MeshDocument &/*m*/, RichParameterList & /*parent*/);
RichParameterList initParameterList(const QAction*, const MeshDocument &/*m*/);
std::map<std::string, QVariant> applyFilter(
const QAction* action,
const RichParameterList & parameters,

View File

@ -195,11 +195,11 @@ std::map<std::string, QVariant> FilterScreenedPoissonPlugin::applyFilter(
return std::map<std::string, QVariant>();
}
void FilterScreenedPoissonPlugin::initParameterList(
RichParameterList FilterScreenedPoissonPlugin::initParameterList(
const QAction* filter,
const MeshModel&,
RichParameterList& parlist)
const MeshModel&)
{
RichParameterList parlist;
if (ID(filter) == FP_SCREENED_POISSON) {
parlist.addParam(RichBool("visibleLayer", false, "Merge all visible layers", "Enabling this flag means that all the visible layers will be used for providing the points."));
parlist.addParam(RichInt("depth", 8, "Reconstruction Depth", "This integer is the maximum depth of the tree that will be used for surface reconstruction. Running at depth d corresponds to solving on a voxel grid whose resolution is no larger than 2^d x 2^d x 2^d. Note that since the reconstructor adapts the octree to the sampling density, the specified reconstruction depth is only an upper bound. The default value for this parameter is 8."));
@ -212,6 +212,7 @@ void FilterScreenedPoissonPlugin::initParameterList(
parlist.addParam(RichBool("confidence", false, "Confidence Flag", "Enabling this flag tells the reconstructor to use the quality as confidence information; this is done by scaling the unit normals with the quality values. When the flag is not enabled, all normals are normalized to have unit-length prior to reconstruction."));
parlist.addParam(RichBool("preClean", false, "Pre-Clean", "Enabling this flag force a cleaning pre-pass on the data removing all unreferenced vertices or vertices with null normals."));
}
return parlist;
}
int FilterScreenedPoissonPlugin::postCondition(const QAction* filter) const

View File

@ -54,7 +54,7 @@ public:
unsigned int& postConditionMask,
vcg::CallBackPos * cb);
void initParameterList(const QAction* a, const MeshModel&, RichParameterList& parlist);
RichParameterList initParameterList(const QAction* a, const MeshModel&);
int postCondition(const QAction* filter) const;
FilterArity filterArity(const QAction*) const;
};

View File

@ -39,8 +39,9 @@ QString SdfGpuPlugin::pluginName() const
return "FilterSDFGPU";
}
void SdfGpuPlugin::initParameterList(const QAction *action, const MeshModel &/*m*/, RichParameterList &par)
RichParameterList SdfGpuPlugin::initParameterList(const QAction *action, const MeshModel &/*m*/)
{
RichParameterList par;
QStringList onPrimitive; onPrimitive.push_back("On vertices"); onPrimitive.push_back("On Faces");
par.addParam( RichEnum("onPrimitive", 0, onPrimitive, "Metric:",
"Choose whether to trace rays from faces or from vertices. " ));
@ -92,6 +93,7 @@ void SdfGpuPlugin::initParameterList(const QAction *action, const MeshModel &/*m
"For each ray that we trace, we take multiple depth values near the point of intersection and we output only the median of these values. "
"Some mesh can benefit from this additional calculation. "));
}
return par;
}
QString SdfGpuPlugin::filterName(ActionIDType filterId) const

View File

@ -47,7 +47,7 @@ class SdfGpuPlugin : public QObject, public FilterPlugin
vcg::CallBackPos * cb);
//Parameters init for user interface
virtual void initParameterList(const QAction* action, const MeshModel &m, RichParameterList &parlst);
RichParameterList initParameterList(const QAction* action, const MeshModel &m);
//Draw the mesh
void fillFrameBuffer(bool front, MeshModel* mm);

View File

@ -192,10 +192,11 @@ QString SelectionFilterPlugin::filterInfo(ActionIDType filterId) const
return QString("Unknown filter");
}
void SelectionFilterPlugin::initParameterList(const QAction *action, const MeshModel &m, RichParameterList &parlst)
RichParameterList SelectionFilterPlugin::initParameterList(const QAction *action, const MeshModel &m)
{
switch(ID(action))
{
RichParameterList parlst;
switch(ID(action))
{
case FP_SELECT_FACES_BY_EDGE:
{
float maxVal = m.cm.bbox.Diag()/2.0f;
@ -302,6 +303,7 @@ void SelectionFilterPlugin::initParameterList(const QAction *action, const MeshM
parlst.addParam(RichBool("allLayers", false, "Apply to all visible Layers", "If selected, the filter will be applied to all visible mesh Layers."));
} break;
}
return parlst;
}
std::map<std::string, QVariant> SelectionFilterPlugin::applyFilter(

View File

@ -70,11 +70,11 @@ public:
SelectionFilterPlugin();
//~SelectionFilterPlugin();
QString pluginName() const;
virtual QString filterInfo(ActionIDType filter) const;
virtual QString filterName(ActionIDType filter) const;
QString filterInfo(ActionIDType filter) const;
QString filterName(ActionIDType filter) const;
virtual FilterClass getClass(const QAction*) const;
void initParameterList(const QAction* action, const MeshModel &m, RichParameterList &parlst);
FilterClass getClass(const QAction*) const;
RichParameterList initParameterList(const QAction* action, const MeshModel &m);
int getPreConditions(const QAction*) const;
int postCondition(const QAction* ) const;
int getRequirements(const QAction*);

View File

@ -98,8 +98,9 @@ int FilterSketchFabPlugin::postCondition(const QAction*) const
return MeshModel::MM_NONE;
}
void FilterSketchFabPlugin::initParameterList(const QAction* action, const MeshModel&, RichParameterList& parlst)
RichParameterList FilterSketchFabPlugin::initParameterList(const QAction* action, const MeshModel&)
{
RichParameterList parlst;
QSettings settings;
QVariant v = settings.value("SketchFab Code");
QString sketchFabAPIValue;
@ -123,6 +124,7 @@ void FilterSketchFabPlugin::initParameterList(const QAction* action, const MeshM
default :
assert(0);
}
return parlst;
}
std::map<std::string, QVariant> FilterSketchFabPlugin::applyFilter(

View File

@ -46,7 +46,7 @@ public:
FilterArity filterArity(const QAction* a) const;
int getPreConditions(const QAction*) const;
int postCondition(const QAction* ) const;
void initParameterList(const QAction*, const MeshModel &/*m*/, RichParameterList & /*parent*/);
RichParameterList initParameterList(const QAction*, const MeshModel &/*m*/);
std::map<std::string, QVariant> applyFilter(
const QAction* action,
const RichParameterList & parameters,

View File

@ -57,12 +57,13 @@ QString FilterSSynth::filterInfo(ActionIDType filterId) const
}
}
void FilterSSynth::initParameterList(const QAction* /*filter*/,const MeshDocument &/*md*/, RichParameterList &par)
RichParameterList FilterSSynth::initParameterList(const QAction* /*filter*/,const MeshDocument &/*md*/)
{
RichParameterList par;
par.addParam(RichString("grammar","set maxdepth 40 R1 R2 rule R1 { { x 1 rz 6 ry 6 s 0.99 } R1 { s 2 } sphere } rule R2 {{ x -1 rz 6 ry 6 s 0.99 } R2 { s 2 } sphere} ","Eisen Script grammar","Write a grammar according to Eisen Script specification and using the primitives box, sphere, mesh, dot and triangle "));
par.addParam(RichInt("seed",1,"seed for random construction","Seed needed to build the mesh"));
par.addParam(RichInt("sphereres",1,"set maximum resolution of sphere primitives, it must be included between 1 and 4","increasing the resolution of the spheres will improve the quality of the mesh "));
return;
return par;
}
void FilterSSynth::openX3D(const QString &fileName, MeshModel &m, int& mask, vcg::CallBackPos *cb, QWidget* /*parent*/)

View File

@ -40,24 +40,24 @@ class FilterSSynth : public QObject, public IOPlugin, public FilterPlugin{
FilterSSynth();
~FilterSSynth(){}
QString pluginName() const;
virtual QString filterName(ActionIDType filter) const;
virtual QString filterInfo(ActionIDType filter) const;
virtual int getRequirements(const QAction*);
virtual void initParameterList(const QAction*, const MeshDocument &/*m*/, RichParameterList & /*parent*/);
QString filterName(ActionIDType filter) const;
QString filterInfo(ActionIDType filter) const;
int getRequirements(const QAction*);
RichParameterList initParameterList(const QAction*, const MeshDocument &/*m*/);
std::map<std::string, QVariant> applyFilter(
const QAction* action,
const RichParameterList & parameters,
MeshDocument &md,
unsigned int& postConditionMask,
vcg::CallBackPos * cb);
virtual FilterClass getClass(const QAction* filter) const;
FilterClass getClass(const QAction* filter) const;
void setAttributes(CMeshO::VertexIterator &vi, CMeshO &m);
static void openX3D(const QString &fileName, MeshModel &m, int& mask, vcg::CallBackPos *cb, QWidget *parent=0);
virtual int postCondition(const QAction* filter) const;
int postCondition(const QAction* filter) const;
std::list<FileFormat> importFormats() const;
std::list<FileFormat> exportFormats() const;
virtual void exportMaskCapability(const QString &format, int &capability, int &defaultBits) const;
void exportMaskCapability(const QString &format, int &capability, int &defaultBits) const;
void initPreOpenParameter(const QString &formatName, RichParameterList &parlst);
void open(const QString &formatName, const QString &fileName, MeshModel &m, int& mask, const RichParameterList & par, vcg::CallBackPos *cb);
void save(const QString &formatName, const QString &fileName, MeshModel &m, const int mask, const RichParameterList &, vcg::CallBackPos *cb);

View File

@ -196,8 +196,9 @@ static QString extractFilenameTexture(const MeshModel* mm)
// - the string shown in the dialog
// - the default value
// - a possibly long string describing the meaning of that parameter (shown as a popup help in the dialog)
void FilterTexturePlugin::initParameterList(const QAction *action, const MeshDocument &md, RichParameterList & parlst)
RichParameterList FilterTexturePlugin::initParameterList(const QAction *action, const MeshDocument &md)
{
RichParameterList parlst;
const MeshModel* trg = md.mm();
for (const MeshModel* tmp : md.meshList){
if (tmp != trg && tmp != nullptr){
@ -267,6 +268,7 @@ void FilterTexturePlugin::initParameterList(const QAction *action, const MeshDoc
break;
default: break; // do not add any parameter for the other filters
}
return parlst;
}

View File

@ -58,7 +58,7 @@ public:
QString pluginName() const;
virtual QString filterName(ActionIDType filter) const;
virtual QString filterInfo(ActionIDType filter) const;
virtual void initParameterList(const QAction*, const MeshDocument &/*m*/, RichParameterList & /*parent*/);
virtual RichParameterList initParameterList(const QAction*, const MeshDocument &/*m*/);
std::map<std::string, QVariant> applyFilter(
const QAction* action,
const RichParameterList & parameters,

View File

@ -134,8 +134,9 @@ FilterTextureDefragPlugin::FilterClass FilterTextureDefragPlugin::getClass(const
return FilterPlugin::Generic;
}
void FilterTextureDefragPlugin::initParameterList(const QAction *action, const MeshDocument &md, RichParameterList & parlst)
RichParameterList FilterTextureDefragPlugin::initParameterList(const QAction *action, const MeshDocument &)
{
RichParameterList parlst;
switch (ID(action)) {
case FP_TEXTURE_DEFRAG:
parlst.addParam(RichFloat(
@ -174,6 +175,7 @@ void FilterTextureDefragPlugin::initParameterList(const QAction *action, const M
default:
break;
}
return parlst;
}
// The Real Core Function doing the actual mesh processing.

View File

@ -49,14 +49,15 @@ class FilterTextureDefragPlugin : public QObject, public FilterPlugin
FilterTextureDefragPlugin();
QString pluginName() const;
virtual QString filterName(ActionIDType filter) const;
virtual QString filterInfo(ActionIDType filter) const;
virtual void initParameterList(const QAction*, const MeshDocument &/*m*/, RichParameterList & /*parent*/);
std::map<std::string, QVariant> applyFilter(const QAction* action,
const RichParameterList & parameters,
MeshDocument &md,
unsigned int& postConditionMask,
vcg::CallBackPos * cb);
QString filterName(ActionIDType filter) const;
QString filterInfo(ActionIDType filter) const;
RichParameterList initParameterList(const QAction*, const MeshDocument &/*m*/);
std::map<std::string, QVariant> applyFilter(
const QAction* action,
const RichParameterList & parameters,
MeshDocument &md,
unsigned int& postConditionMask,
vcg::CallBackPos * cb);
virtual int getRequirements(const QAction*);
virtual int getPreConditions(const QAction*) const;
virtual int postCondition(const QAction* ) const;

View File

@ -202,8 +202,9 @@ int TriOptimizePlugin::postCondition(const QAction *a) const
// - the string shown in the dialog
// - the default value
// - a possibly long string describing the meaning of that parameter (shown as a popup help in the dialog)
void TriOptimizePlugin::initParameterList(const QAction *action, const MeshModel &m, RichParameterList & parlst)
RichParameterList TriOptimizePlugin::initParameterList(const QAction *action, const MeshModel &m)
{
RichParameterList parlst;
if (ID(action) == FP_CURVATURE_EDGE_FLIP) {
parlst.addParam(RichBool("selection", m.cm.sfn > 0, tr("Update selection"), tr("Apply edge flip optimization on selected faces only")));
parlst.addParam(RichFloat("pthreshold", 1.0f,
@ -259,6 +260,7 @@ void TriOptimizePlugin::initParameterList(const QAction *action, const MeshModel
parlst.addParam(RichFloat("AngleDeg", 0.5f, tr("Max Normal Dev (deg)"), tr("maximum mean normal angle displacement (degrees) from old to new faces")));
parlst.addParam(RichInt("iterations", 1, "Iterations", tr("number of laplacian smooth iterations in every run")));
}
return parlst;
}
// The Real Core Function doing the actual mesh processing.

View File

@ -47,7 +47,7 @@ public:
QString pluginName() const;
QString filterName(ActionIDType filter) const;
QString filterInfo(ActionIDType filter) const;
void initParameterList(const QAction*, const MeshModel &/*m*/, RichParameterList & /*parent*/);
RichParameterList initParameterList(const QAction*, const MeshModel &/*m*/);
std::map<std::string, QVariant> applyFilter(
const QAction* action,
const RichParameterList & parameters,

View File

@ -312,8 +312,9 @@ int FilterUnsharp::postCondition(const QAction *a) const
return MeshModel::MM_NONE;
}
void FilterUnsharp::initParameterList(const QAction *action, const MeshDocument &md, RichParameterList & parlst)
RichParameterList FilterUnsharp::initParameterList(const QAction *action, const MeshDocument &md)
{
RichParameterList parlst;
switch(ID(action))
{
case FP_RECOMPUTE_VERTEX_NORMAL :
@ -403,6 +404,7 @@ void FilterUnsharp::initParameterList(const QAction *action, const MeshDocument
parlst.addParam(RichBool("colorize", true, "Colorize", "Colorize the mesh to provide an indication of the obtained harmonic field."));
break;
}
return parlst;
}
std::map<std::string, QVariant> FilterUnsharp::applyFilter(

View File

@ -78,7 +78,7 @@ public:
MeshDocument &md,
unsigned int& postConditionMask,
vcg::CallBackPos * cb);
void initParameterList(const QAction* action, const MeshDocument &/*m*/, RichParameterList & parlst);
RichParameterList initParameterList(const QAction* action, const MeshDocument &/*m*/);
int postCondition(const QAction* ) const;
int getPreConditions(const QAction*) const;
FilterArity filterArity(const QAction* filter) const;

View File

@ -132,21 +132,22 @@ FilterPlugin::FilterArity FilterVoronoiPlugin::filterArity(const QAction* a) con
}
}
void FilterVoronoiPlugin::initParameterList(const QAction* action, const MeshModel& m, RichParameterList& par)
RichParameterList FilterVoronoiPlugin::initParameterList(const QAction* action, const MeshModel& m)
{
switch(ID(action)) {
case VORONOI_SAMPLING :
par.addParam(RichInt("iterNum", 10, "Iteration", "number of iterations"));
par.addParam(RichInt("sampleNum", 10, "Sample Num.", "Number of samples"));
par.addParam(RichFloat("radiusVariance", 1, "Radius Variance", "The distance metric will vary along the surface between 1/x and x, linearly according to the scalar field specified by the quality."));
par.addParam(RichEnum("colorStrategy", 1, {"None", "Seed Distance", "Border Distance", "Region Area"}, "Color Strategy"));
par.addParam(RichEnum("distanceType", 0, {"Euclidean", "Quality Weighted", "Anisotropic"}, "Distance Type"));
par.addParam(RichBool("preprocessFlag", false, "Preprocessing"));
par.addParam(RichInt("refineFactor", 10, "Refinement Factor", "To ensure good convergence the mesh should be more complex than the voronoi partitioning. This number affect how much the mesh is refined according to the required number of samples."));
par.addParam(RichFloat("perturbProbability", 0, "Perturbation Probability", "To ensure good convergence the mesh should be more complex than the voronoi partitioning. This number affect how much the mesh is refined according to the required number of samples."));
par.addParam(RichFloat("perturbAmount", 0.001, "Perturbation Amount", "To ensure good convergence the mesh should be more complex than the voronoi partitioning. This number affect how much the mesh is refined according to the required number of samples."));
par.addParam(RichInt("randomSeed", 0, "Random seed", "To ensure repeatability you can specify the random seed used. If 0 the random seed is tied to the current clock."));
par.addParam(RichEnum("relaxType", 1, {"Geodesic", "Squared Distance", "Restricted"}, "Relax Type",
RichParameterList par;
switch(ID(action)) {
case VORONOI_SAMPLING :
par.addParam(RichInt("iterNum", 10, "Iteration", "number of iterations"));
par.addParam(RichInt("sampleNum", 10, "Sample Num.", "Number of samples"));
par.addParam(RichFloat("radiusVariance", 1, "Radius Variance", "The distance metric will vary along the surface between 1/x and x, linearly according to the scalar field specified by the quality."));
par.addParam(RichEnum("colorStrategy", 1, {"None", "Seed Distance", "Border Distance", "Region Area"}, "Color Strategy"));
par.addParam(RichEnum("distanceType", 0, {"Euclidean", "Quality Weighted", "Anisotropic"}, "Distance Type"));
par.addParam(RichBool("preprocessFlag", false, "Preprocessing"));
par.addParam(RichInt("refineFactor", 10, "Refinement Factor", "To ensure good convergence the mesh should be more complex than the voronoi partitioning. This number affect how much the mesh is refined according to the required number of samples."));
par.addParam(RichFloat("perturbProbability", 0, "Perturbation Probability", "To ensure good convergence the mesh should be more complex than the voronoi partitioning. This number affect how much the mesh is refined according to the required number of samples."));
par.addParam(RichFloat("perturbAmount", 0.001, "Perturbation Amount", "To ensure good convergence the mesh should be more complex than the voronoi partitioning. This number affect how much the mesh is refined according to the required number of samples."));
par.addParam(RichInt("randomSeed", 0, "Random seed", "To ensure repeatability you can specify the random seed used. If 0 the random seed is tied to the current clock."));
par.addParam(RichEnum("relaxType", 1, {"Geodesic", "Squared Distance", "Restricted"}, "Relax Type",
"At each relaxation step we search for each voronoi region the new position of the seed. "
"According to the classical LLoyd relaxation strategy it should have been placed onto the "
"barycenter of the region. Over a surface we have two different strategies: <ul>"
@ -154,45 +155,46 @@ void FilterVoronoiPlugin::initParameterList(const QAction* action, const MeshMod
"<li> Squared Distance: the seed is placed in the vertex that minimize the squared sum of the distances from all the pints of the region.</li>"
"<li> Restricted: the seed is placed in the barycenter of current voronoi region. Even if it is outside the surface. During the relaxation process the seed is free to move off the surface in a continuous way. Re-association to vertex is done at the end..</li>"
"</ul>"));
break;
case VOLUME_SAMPLING:
par.addParam(RichAbsPerc("sampleSurfRadius", m.cm.bbox.Diag() / 500.0, 0, m.cm.bbox.Diag(),"Surface Sampling Radius", "Surface Sampling is used only as an optimization."));
par.addParam(RichInt("sampleVolNum", 200000, "Volume Sample Num.", "Number of volumetric samples scattered inside the mesh and used for choosing the voronoi seeds and performing the Lloyd relaxation for having a centroidal voronoi diagram."));
par.addParam(RichBool("poissonFiltering", true, "Poisson Filtering", "If true the base montecarlo sampling of the volume is filtered to get a poisson disk volumetric distribution."));
par.addParam(RichAbsPerc("poissonRadius", m.cm.bbox.Diag() / 100.0, 0, m.cm.bbox.Diag(), "Poisson Radius", "Number of voxel per side in the volumetric representation."));
break;
case VORONOI_SCAFFOLDING:
par.addParam(RichAbsPerc("sampleSurfRadius", m.cm.bbox.Diag() / 100.0, 0, m.cm.bbox.Diag(), "Surface Sampling Radius", "Surface Sampling is used only as an optimization."));
par.addParam(RichInt("sampleVolNum", 100000, "Volume Sample Num.", "Number of volumetric samples scattered inside the mesh and used for choosing the voronoi seeds and performing the Lloyd relaxation for having a centroidal voronoi diagram."));
par.addParam(RichInt("voxelRes", 50, "Volume Side Resolution", "Number of voxel per side in the volumetric representation."));
par.addParam(RichFloat("isoThr", 1, "Width of the entity (in voxel)", "Number of voxel per side in the volumetric representation."));
par.addParam(RichInt("smoothStep", 3, "Smooth Step", "Number of voxel per side in the volumetric representation."));
par.addParam(RichInt("relaxStep", 5, "Lloyd Relax Step", "Number of Lloyd relaxation step to get a better distribution of the voronoi seeds."));
par.addParam(RichBool("surfFlag", true, "Add original surface", "Number of voxel per side in the volumetric representation."));
par.addParam(RichEnum("elemType", 1, {"Seed", "Edge", "Face"}, "Voronoi Element"));
break;
case BUILD_SHELL:
par.addParam(RichBool("edgeCylFlag", true, "Edge -> Cyl.", "If True all the edges are converted into cylinders."));
par.addParam(RichAbsPerc("edgeCylRadius", m.cm.bbox.Diag() / 100.0, 0, m.cm.bbox.Diag(), "Edge Cylinder Rad.", "The radius of the cylinder replacing each edge."));
par.addParam(RichBool("vertCylFlag", false, "Vertex -> Cyl.", "If True all the vertices are converted into cylinders."));
par.addParam(RichAbsPerc("vertCylRadius", m.cm.bbox.Diag() / 100.0, 0, m.cm.bbox.Diag(), "Vertex Cylinder Rad.", "The radius of the cylinder replacing each vertex."));
par.addParam(RichBool("vertSphFlag", true, "Vertex -> Sph.", "If True all the vertices are converted into sphere."));
par.addParam(RichAbsPerc("vertSphRadius", m.cm.bbox.Diag() / 100.0, 0, m.cm.bbox.Diag(), "Vertex Sphere Rad.", "The radius of the sphere replacing each vertex."));
par.addParam(RichBool("faceExtFlag", true, "Face -> Prism", "If True all the faces are converted into prism."));
par.addParam(RichAbsPerc("faceExtHeight", m.cm.bbox.Diag() / 200.0, 0, m.cm.bbox.Diag(), "Face Prism Height", "The Height of the prism that is substitued with each face."));
par.addParam(RichAbsPerc("faceExtInset", m.cm.bbox.Diag() / 200.0, 0, m.cm.bbox.Diag(), "Face Prism Inset", "The inset radius of each prism, e.g. how much it is moved toward the inside each vertex on the border of the prism."));
par.addParam(RichBool("edgeFauxFlag", true, "Ignore faux edges", "If true only the Non-Faux edges will be considered for conversion."));
par.addParam(RichInt("cylinderSideNum", 16, "Cylinder Side", "Number of sides of the cylinder (both edge and vertex)."));
break;
case CROSS_FIELD_CREATION:
par.addParam(RichEnum("crossType", 0, {"Linear Y", "Radial", "Curvature"}, "Cross Type", ""));
break;
// case CROSS_FIELD_SMOOTHING:
// par.addParam(RichBool("preprocessFlag", true, "Preprocessing"));
// break;
default :
assert(0);
}
break;
case VOLUME_SAMPLING:
par.addParam(RichAbsPerc("sampleSurfRadius", m.cm.bbox.Diag() / 500.0, 0, m.cm.bbox.Diag(),"Surface Sampling Radius", "Surface Sampling is used only as an optimization."));
par.addParam(RichInt("sampleVolNum", 200000, "Volume Sample Num.", "Number of volumetric samples scattered inside the mesh and used for choosing the voronoi seeds and performing the Lloyd relaxation for having a centroidal voronoi diagram."));
par.addParam(RichBool("poissonFiltering", true, "Poisson Filtering", "If true the base montecarlo sampling of the volume is filtered to get a poisson disk volumetric distribution."));
par.addParam(RichAbsPerc("poissonRadius", m.cm.bbox.Diag() / 100.0, 0, m.cm.bbox.Diag(), "Poisson Radius", "Number of voxel per side in the volumetric representation."));
break;
case VORONOI_SCAFFOLDING:
par.addParam(RichAbsPerc("sampleSurfRadius", m.cm.bbox.Diag() / 100.0, 0, m.cm.bbox.Diag(), "Surface Sampling Radius", "Surface Sampling is used only as an optimization."));
par.addParam(RichInt("sampleVolNum", 100000, "Volume Sample Num.", "Number of volumetric samples scattered inside the mesh and used for choosing the voronoi seeds and performing the Lloyd relaxation for having a centroidal voronoi diagram."));
par.addParam(RichInt("voxelRes", 50, "Volume Side Resolution", "Number of voxel per side in the volumetric representation."));
par.addParam(RichFloat("isoThr", 1, "Width of the entity (in voxel)", "Number of voxel per side in the volumetric representation."));
par.addParam(RichInt("smoothStep", 3, "Smooth Step", "Number of voxel per side in the volumetric representation."));
par.addParam(RichInt("relaxStep", 5, "Lloyd Relax Step", "Number of Lloyd relaxation step to get a better distribution of the voronoi seeds."));
par.addParam(RichBool("surfFlag", true, "Add original surface", "Number of voxel per side in the volumetric representation."));
par.addParam(RichEnum("elemType", 1, {"Seed", "Edge", "Face"}, "Voronoi Element"));
break;
case BUILD_SHELL:
par.addParam(RichBool("edgeCylFlag", true, "Edge -> Cyl.", "If True all the edges are converted into cylinders."));
par.addParam(RichAbsPerc("edgeCylRadius", m.cm.bbox.Diag() / 100.0, 0, m.cm.bbox.Diag(), "Edge Cylinder Rad.", "The radius of the cylinder replacing each edge."));
par.addParam(RichBool("vertCylFlag", false, "Vertex -> Cyl.", "If True all the vertices are converted into cylinders."));
par.addParam(RichAbsPerc("vertCylRadius", m.cm.bbox.Diag() / 100.0, 0, m.cm.bbox.Diag(), "Vertex Cylinder Rad.", "The radius of the cylinder replacing each vertex."));
par.addParam(RichBool("vertSphFlag", true, "Vertex -> Sph.", "If True all the vertices are converted into sphere."));
par.addParam(RichAbsPerc("vertSphRadius", m.cm.bbox.Diag() / 100.0, 0, m.cm.bbox.Diag(), "Vertex Sphere Rad.", "The radius of the sphere replacing each vertex."));
par.addParam(RichBool("faceExtFlag", true, "Face -> Prism", "If True all the faces are converted into prism."));
par.addParam(RichAbsPerc("faceExtHeight", m.cm.bbox.Diag() / 200.0, 0, m.cm.bbox.Diag(), "Face Prism Height", "The Height of the prism that is substitued with each face."));
par.addParam(RichAbsPerc("faceExtInset", m.cm.bbox.Diag() / 200.0, 0, m.cm.bbox.Diag(), "Face Prism Inset", "The inset radius of each prism, e.g. how much it is moved toward the inside each vertex on the border of the prism."));
par.addParam(RichBool("edgeFauxFlag", true, "Ignore faux edges", "If true only the Non-Faux edges will be considered for conversion."));
par.addParam(RichInt("cylinderSideNum", 16, "Cylinder Side", "Number of sides of the cylinder (both edge and vertex)."));
break;
case CROSS_FIELD_CREATION:
par.addParam(RichEnum("crossType", 0, {"Linear Y", "Radial", "Curvature"}, "Cross Type", ""));
break;
// case CROSS_FIELD_SMOOTHING:
// par.addParam(RichBool("preprocessFlag", true, "Preprocessing"));
// break;
default :
assert(0);
}
return par;
}
int FilterVoronoiPlugin::getPreConditions(const QAction* action) const

View File

@ -49,7 +49,7 @@ public:
QString filterInfo(ActionIDType filter) const;
FilterClass getClass(const QAction* a) const;
FilterArity filterArity(const QAction* a) const;
void initParameterList(const QAction* action, const MeshModel& m, RichParameterList& par);
RichParameterList initParameterList(const QAction* action, const MeshModel& m);
int getPreConditions(const QAction* action) const;
std::map<std::string, QVariant> applyFilter(
const QAction* action,

View File

@ -617,8 +617,7 @@ public:
//A filter in the script file couldn't have all the required parameter not defined (a script file not generated by MeshLab).
//So we have to ask to the filter the default values for all the parameters and integrate them with the parameters' values
//defined in the script file.
RichParameterList required;
iFilter->initParameterList(action,meshDocument,required);
RichParameterList required = iFilter->initParameterList(action,meshDocument);
RichParameterList &parameterSet = pair.second;
//The parameters in the script file are more than the required parameters of the filter. The script file is not correct.