class of nxs builder plugin

This commit is contained in:
alemuntoni 2021-07-23 16:41:19 +02:00
parent a586d36781
commit 7a9576f97d
6 changed files with 196 additions and 211 deletions

View File

@ -68,7 +68,8 @@ public:
PointSet = 0x08000,
Measure = 0x10000, /*!< Filters that compute measures and information on meshes.*/
Polygonal = 0x20000, /*!< Filters that works on polygonal and quad meshes.*/
Camera = 0x40000 /*!< Filters that works on shot of mesh and raster.*/
Camera = 0x40000, /*!< Filters that works on shot of mesh and raster.*/
Other = 0x80000
};

View File

@ -358,159 +358,164 @@ public:
private:
WordActionsMapAccessor wama;
//////// ToolBars ///////////////
QToolBar *mainToolBar;
QToolBar *decoratorToolBar;
QToolBar *editToolBar;
QToolBar *filterToolBar;
QToolBar *searchToolBar;
QToolBar* mainToolBar;
QToolBar* decoratorToolBar;
QToolBar* editToolBar;
QToolBar* filterToolBar;
QToolBar* searchToolBar;
MLRenderingGlobalToolbar* globrendtoolbar;
///////// Menus ///////////////
QMenu *fileMenu;
QMenu *filterMenu;
QMenu* fileMenu;
QMenu* filterMenu;
QMenu* recentProjMenu;
QMenu* recentFileMenu;
QMenu *filterMenuSelect;
QMenu *filterMenuClean;
QMenu *filterMenuCreate;
QMenu *filterMenuRemeshing;
QMenu *filterMenuPolygonal;
QMenu *filterMenuColorize;
QMenu *filterMenuSmoothing;
QMenu *filterMenuQuality;
QMenu *filterMenuMeshLayer;
QMenu *filterMenuRasterLayer;
QMenu *filterMenuNormal;
QMenu *filterMenuRangeMap;
QMenu *filterMenuPointSet;
QMenu *filterMenuSampling;
QMenu *filterMenuTexture;
QMenu *filterMenuCamera;
QMenu* filterMenuSelect;
QMenu* filterMenuClean;
QMenu* filterMenuCreate;
QMenu* filterMenuRemeshing;
QMenu* filterMenuPolygonal;
QMenu* filterMenuColorize;
QMenu* filterMenuSmoothing;
QMenu* filterMenuQuality;
QMenu* filterMenuMeshLayer;
QMenu* filterMenuRasterLayer;
QMenu* filterMenuNormal;
QMenu* filterMenuRangeMap;
QMenu* filterMenuPointSet;
QMenu* filterMenuSampling;
QMenu* filterMenuTexture;
QMenu* filterMenuCamera;
QMenu* filterMenuOther;
QMenu *editMenu;
QMenu* editMenu;
//Render Menu and SubMenu ////
QMenu *shadersMenu;
QMenu *renderMenu;
QMenu* shadersMenu;
QMenu* renderMenu;
//View Menu and SubMenu //////
QMenu *viewMenu;
QMenu *toolBarMenu;
QMenu* viewMenu;
QMenu* toolBarMenu;
//////////////////////////////
QMenu *windowsMenu;
QMenu *preferencesMenu;
QMenu *helpMenu;
QMenu *splitModeMenu;
QMenu *viewFromMenu;
QMenu *trackballStepMenu;
QMenu* windowsMenu;
QMenu* preferencesMenu;
QMenu* helpMenu;
QMenu* splitModeMenu;
QMenu* viewFromMenu;
QMenu* trackballStepMenu;
//////////// Split/Unsplit Menu from handle///////////
QMenu *handleMenu;
QMenu *splitMenu;
QMenu *unSplitMenu;
QMenu* handleMenu;
QMenu* splitMenu;
QMenu* unSplitMenu;
////////// Search Shortcut ////////////////
QShortcut* searchShortCut;
MyToolButton* searchButton;
SearchMenu* searchMenu;
//////////// Actions Menu File ///////////////////////
QAction *newProjectAct;
QAction *openProjectAct, *appendProjectAct, *saveProjectAct;
QAction *importMeshAct, *exportMeshAct, *exportMeshAsAct;
QAction *importRasterAct;
QAction *closeProjectAct;
QAction *reloadMeshAct;
QAction *reloadAllMeshAct;
QAction *saveSnapshotAct;
QAction *recentFileActs[MAXRECENTFILES];
QAction *recentProjActs[MAXRECENTFILES];
QAction *exitAct;
QAction* newProjectAct;
QAction* openProjectAct;
QAction* appendProjectAct;
QAction* saveProjectAct;
QAction* importMeshAct;
QAction* exportMeshAct;
QAction* exportMeshAsAct;
QAction* importRasterAct;
QAction* closeProjectAct;
QAction* reloadMeshAct;
QAction* reloadAllMeshAct;
QAction* saveSnapshotAct;
QAction* recentFileActs[MAXRECENTFILES];
QAction* recentProjActs[MAXRECENTFILES];
QAction* exitAct;
//////
QAction *lastFilterAct;
QAction *runFilterScriptAct;
QAction *showFilterScriptAct;
QAction* lastFilterAct;
QAction* runFilterScriptAct;
QAction* showFilterScriptAct;
//QAction* showFilterEditAct;
/////////// Actions Menu Edit /////////////////////
QAction *suspendEditModeAct;
QAction* suspendEditModeAct;
///////////Actions Menu View ////////////////////////
QAction *fullScreenAct;
QAction *showToolbarStandardAct;
QAction *showInfoPaneAct;
QAction *showTrackBallAct;
QAction *resetTrackBallAct;
QAction *showLayerDlgAct;
QAction *showRasterAct;
QAction* fullScreenAct;
QAction* showToolbarStandardAct;
QAction* showInfoPaneAct;
QAction* showTrackBallAct;
QAction* resetTrackBallAct;
QAction* showLayerDlgAct;
QAction* showRasterAct;
///////////Actions Menu Windows /////////////////////
QAction *windowsTileAct;
QAction *windowsCascadeAct;
QAction *windowsNextAct;
QAction *closeAllAct;
QAction *setSplitHAct;
QAction *setSplitVAct;
QActionGroup *setSplitGroupAct;
QAction *setUnsplitAct;
QAction* windowsTileAct;
QAction* windowsCascadeAct;
QAction* windowsNextAct;
QAction* closeAllAct;
QAction* setSplitHAct;
QAction* setSplitVAct;
QActionGroup* setSplitGroupAct;
QAction* setUnsplitAct;
///////////Actions Menu Windows -> Split/UnSplit from Handle ////////////////////////
QActionGroup *splitGroupAct;
QActionGroup *unsplitGroupAct;
QActionGroup* splitGroupAct;
QActionGroup* unsplitGroupAct;
QAction *splitUpAct;
QAction *splitDownAct;
QAction* splitUpAct;
QAction* splitDownAct;
QAction *unsplitUpAct;
QAction *unsplitDownAct;
QAction* unsplitUpAct;
QAction* unsplitDownAct;
QAction *splitRightAct;
QAction *splitLeftAct;
QAction* splitRightAct;
QAction* splitLeftAct;
QAction *unsplitRightAct;
QAction *unsplitLeftAct;
QAction* unsplitRightAct;
QAction* unsplitLeftAct;
///////////Actions Menu Windows -> View From ////////////////////////
QActionGroup *viewFromGroupAct;
QAction *viewTopAct;
QAction *viewBottomAct;
QAction *viewLeftAct;
QAction *viewRightAct;
QAction *viewFrontAct;
QAction *viewBackAct;
QAction *viewTopYAct;
QAction *viewBottomYAct;
QAction *viewLeftYAct;
QAction *viewRightYAct;
QAction *viewFrontYAct;
QAction *viewBackYAct;
QAction *viewFromMeshAct;
QAction *viewFromRasterAct;
QAction *readViewFromFileAct;
QAction *saveViewToFileAct;
QActionGroup* viewFromGroupAct;
QAction* viewTopAct;
QAction* viewBottomAct;
QAction* viewLeftAct;
QAction* viewRightAct;
QAction* viewFrontAct;
QAction* viewBackAct;
QAction* viewTopYAct;
QAction* viewBottomYAct;
QAction* viewLeftYAct;
QAction* viewRightYAct;
QAction* viewFrontYAct;
QAction* viewBackYAct;
QAction* viewFromMeshAct;
QAction* viewFromRasterAct;
QAction* readViewFromFileAct;
QAction* saveViewToFileAct;
QAction *toggleOrthoAct;
QAction* toggleOrthoAct;
QActionGroup *trackballStepGroupAct;
QAction *trackballStepHP;
QAction *trackballStepHM;
QAction *trackballStepVP;
QAction *trackballStepVM;
QAction *trackballStepSP;
QAction *trackballStepSM;
QActionGroup* trackballStepGroupAct;
QAction* trackballStepHP;
QAction* trackballStepHM;
QAction* trackballStepVP;
QAction* trackballStepVM;
QAction* trackballStepSP;
QAction* trackballStepSM;
///////////Actions Menu Windows -> Link/Copy/Paste View ////////////////////////
public:
QAction *linkViewersAct;
QAction* linkViewersAct;
private:
QAction *copyShotToClipboardAct;
QAction *pasteShotFromClipboardAct;
QAction* copyShotToClipboardAct;
QAction* pasteShotFromClipboardAct;
///////////Actions Menu Preferences /////////////////
QAction *setCustomizeAct;
QAction* setCustomizeAct;
///////////Actions Menu Help ////////////////////////
QAction *aboutAct;
QAction *aboutPluginsAct;
QAction *submitBugAct;
QAction *onlineHelpAct;
QAction *onscreenHelpAct;
QAction *checkUpdatesAct;
QAction* aboutAct;
QAction* aboutPluginsAct;
QAction* submitBugAct;
QAction* onlineHelpAct;
QAction* onscreenHelpAct;
QAction* checkUpdatesAct;
////////////////////////////////////////////////////
static QString getDecoratedFileName(const QString& name);

View File

@ -744,6 +744,8 @@ void MainWindow::fillFilterMenu()
filterMenu->addMenu(filterMenuTexture);
filterMenuCamera = new MenuWithToolTip(tr("Camera"), this);
filterMenu->addMenu(filterMenuCamera);
filterMenuOther = new MenuWithToolTip(tr("Other"), this);
filterMenu->addMenu(filterMenuOther);
//this is used just to fill the menus with alhabetical order
@ -761,89 +763,72 @@ void MainWindow::fillFilterMenu()
QAction *filterAction = iFilter->getFilterAction(p.first);
QString tooltip = iFilter->filterInfo(filterAction) + "<br>" + getDecoratedFileName(filterAction->data().toString());
filterAction->setToolTip(tooltip);
//connect(filterAction, SIGNAL(hovered()), this, SLOT(showActionMenuTooltip()) );
connect(filterAction, SIGNAL(triggered()), this, SLOT(startFilter()));
int filterClass = iFilter->getClass(filterAction);
if (filterClass & FilterPlugin::FaceColoring)
{
if (filterClass & FilterPlugin::FaceColoring) {
filterMenuColorize->addAction(filterAction);
}
if (filterClass & FilterPlugin::VertexColoring)
{
if (filterClass & FilterPlugin::VertexColoring) {
filterMenuColorize->addAction(filterAction);
}
if (filterClass & FilterPlugin::MeshColoring)
{
if (filterClass & FilterPlugin::MeshColoring) {
filterMenuColorize->addAction(filterAction);
}
if (filterClass & FilterPlugin::Selection)
{
if (filterClass & FilterPlugin::Selection) {
filterMenuSelect->addAction(filterAction);
}
if (filterClass & FilterPlugin::Cleaning)
{
if (filterClass & FilterPlugin::Cleaning) {
filterMenuClean->addAction(filterAction);
}
if (filterClass & FilterPlugin::Remeshing)
{
if (filterClass & FilterPlugin::Remeshing) {
filterMenuRemeshing->addAction(filterAction);
}
if (filterClass & FilterPlugin::Smoothing)
{
if (filterClass & FilterPlugin::Smoothing) {
filterMenuSmoothing->addAction(filterAction);
}
if (filterClass & FilterPlugin::Normal)
{
if (filterClass & FilterPlugin::Normal) {
filterMenuNormal->addAction(filterAction);
}
if (filterClass & FilterPlugin::Quality)
{
if (filterClass & FilterPlugin::Quality) {
filterMenuQuality->addAction(filterAction);
}
if (filterClass & FilterPlugin::Measure)
{
if (filterClass & FilterPlugin::Measure) {
filterMenuQuality->addAction(filterAction);
}
if (filterClass & FilterPlugin::Layer)
{
if (filterClass & FilterPlugin::Layer) {
filterMenuMeshLayer->addAction(filterAction);
}
if (filterClass & FilterPlugin::RasterLayer)
{
if (filterClass & FilterPlugin::RasterLayer) {
filterMenuRasterLayer->addAction(filterAction);
}
if (filterClass & FilterPlugin::MeshCreation)
{
if (filterClass & FilterPlugin::MeshCreation) {
filterMenuCreate->addAction(filterAction);
}
if (filterClass & FilterPlugin::RangeMap)
{
if (filterClass & FilterPlugin::RangeMap) {
filterMenuRangeMap->addAction(filterAction);
}
if (filterClass & FilterPlugin::PointSet)
{
if (filterClass & FilterPlugin::PointSet) {
filterMenuPointSet->addAction(filterAction);
}
if (filterClass & FilterPlugin::Sampling)
{
if (filterClass & FilterPlugin::Sampling) {
filterMenuSampling->addAction(filterAction);
}
if (filterClass & FilterPlugin::Texture)
{
if (filterClass & FilterPlugin::Texture) {
filterMenuTexture->addAction(filterAction);
}
if (filterClass & FilterPlugin::Polygonal)
{
if (filterClass & FilterPlugin::Polygonal) {
filterMenuPolygonal->addAction(filterAction);
}
if (filterClass & FilterPlugin::Camera)
{
if (filterClass & FilterPlugin::Camera) {
filterMenuCamera->addAction(filterAction);
}
if (filterClass & FilterPlugin::Other) {
filterMenuOther->addAction(filterAction);
}
// MeshFilterInterface::Generic :
if (filterClass == 0)
{
if (filterClass == 0) {
filterMenu->addAction(filterAction);
}
//if(!filterAction->icon().isNull())

View File

@ -1223,7 +1223,7 @@ void OpenFileWidget::selectFile()
//OpenFileDecoration* dec = reinterpret_cast<OpenFileDecoration*>(rp->pd);
RichOpenFile* dec = reinterpret_cast<RichOpenFile*>(rp);
QString ext;
QString fl = QFileDialog::getOpenFileName(this,tr("Open"),rp->value().getString(), dec->exts.join(" "));
QString fl = QFileDialog::getOpenFileName(this,tr("Open"),rp->value().getString(), dec->exts.join(";;"));
collectWidgetValue();
updateFileName(fl);
StringValue fileName(fl);

View File

@ -23,6 +23,17 @@
#include "filter_nxs_builder.h"
#include <QTextStream>
#include <QTemporaryDir>
#include <nxsbuild/nexusbuilder.h>
#include <nxsbuild/meshstream.h>
#include <nxsbuild/vcgloader.h>
#include <nxsbuild/kdtree.h>
#include <nxsbuild/nexusbuilder.h>
#include <common/traversal.h>
#include <nxsedit/extractor.h>
/**
* @brief
* Constructor usually performs only two simple tasks of filling the two lists
@ -81,7 +92,7 @@ QString NxsBuilderPlugin::filterInfo(ActionIDType filterId) const
{
switch(filterId) {
case FP_NXS_BUILDER :
return "Move the vertices of the mesh of a random quantity.";
return "Create a nxs file starting from a obj, ply or stl.";
default :
assert(0);
return "Unknown Filter";
@ -99,7 +110,8 @@ NxsBuilderPlugin::FilterClass NxsBuilderPlugin::getClass(const QAction *a) const
{
switch(ID(a)) {
case FP_NXS_BUILDER :
return FilterPlugin::Smoothing;
case FP_NXS_COMPRESS:
return FilterPlugin::Other;
default :
assert(0);
return FilterPlugin::Generic;
@ -112,7 +124,7 @@ NxsBuilderPlugin::FilterClass NxsBuilderPlugin::getClass(const QAction *a) const
*/
FilterPlugin::FilterArity NxsBuilderPlugin::filterArity(const QAction*) const
{
return SINGLE_MESH;
return NONE;
}
/**
@ -130,7 +142,7 @@ int NxsBuilderPlugin::getPreConditions(const QAction*) const
*/
int NxsBuilderPlugin::postCondition(const QAction*) const
{
return MeshModel::MM_VERTCOORD | MeshModel::MM_FACENORMAL | MeshModel::MM_VERTNORMAL;
return MeshModel::MM_NONE;
}
/**
@ -143,18 +155,39 @@ int NxsBuilderPlugin::postCondition(const QAction*) const
* @param action
* @param m
*/
RichParameterList NxsBuilderPlugin::initParameterList(const QAction *action, const MeshModel &m)
RichParameterList NxsBuilderPlugin::initParameterList(const QAction *action, const MeshModel &)
{
RichParameterList parlst;
RichParameterList params;
switch(ID(action)) {
case FP_NXS_BUILDER :
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."));
parlst.addParam(RichAbsPerc("Displacement", m.cm.bbox.Diag()/100.0f,0.0f,m.cm.bbox.Diag(), "Max displacement", "The vertex are displaced of a vector whose norm is bounded by this value"));
params.addParam(RichOpenFile("input_file", "", {"*.ply", "*.obj", "*.stl", "*.tsp"}, "", ""));
params.addParam(RichSaveFile("out_file", "", "*.nxs", "", ""));
params.addParam(RichInt("node_faces", 1<<15, "Node faces", "Number of faces per patch"));
params.addParam(RichInt("top_node_faces", 4096, "Top node faces", "Number of triangles in the top node"));
params.addParam(RichInt("tex_quality", 100, "Texture quality [0-100]", "jpg texture quality"));
params.addParam(RichInt("ram", 2000, "Ram buffer", "Max ram used (in MegaBytes)", true));
params.addParam(RichInt("skiplevels", 0, "Skip levels", "Decimation skipped for n levels"));
params.addParam(RichPoint3f("origin", Point3m(0,0,0), "Origin", "new origin for the model"));
params.addParam(RichBool("center", false, "Center", "Set origin in the bounding box center", true));
params.addParam(RichBool("pow_2_textures", false, "Pow 2 textures", "Create textures to be power of 2", true));
params.addParam(RichBool("deepzoom", false, "Deepzoom", "Save each node and texture to a separated file", true));
params.addParam(RichDynamicFloat("adaptive", 0.333, 0, 1, "Adaptive", "Split nodes adaptively"));
break;
case FP_NXS_COMPRESS:
params.addParam(RichOpenFile("input_file", "", {"*.nxs"}, "", ""));
params.addParam(RichSaveFile("out_file", "", "*.nxz", "", ""));
params.addParam(RichFloat("nxz_vertex_quantization", 0.0, "NXZ Vertex quantization", "absolute side of quantization grid (uses quantization factor, instead)", false, "NXZ parameters"));
params.addParam(RichInt("vertex_bits", 0, "Vertex bits", "number of bits in vertex coordinates when compressing (uses quantization factor, instead)", false, "NXZ parameters"));
params.addParam(RichFloat("quantization_factor", 0.1, "Quantization factor", "Quantization as a factor of error", false, "NXZ parameters"));
params.addParam(RichInt("luma_bits", 6, "Luma bits", "Quantization of luma channel", true, "NXZ parameters"));
params.addParam(RichInt("chroma_bits", 6, "Chroma bits", "Quantization of chroma channel", true, "NXZ parameters"));
params.addParam(RichInt("alpha_bits", 5, "Alpha bits", "Quantization of alpha channel", true, "NXZ parameters"));
params.addParam(RichInt("normal_bits", 10, "Normal bits", "Quantization of normals", true, "NXZ parameters"));
params.addParam(RichFloat("textures_precision", 0.25, "Textures precision", "Quantization of textures, precision in pixels per unit", true, "NXZ parameters"));
default :
assert(0);
}
return parlst;
return params;
}
/**
@ -166,15 +199,16 @@ RichParameterList NxsBuilderPlugin::initParameterList(const QAction *action, con
* @return true if the filter has been applied correctly, false otherwise
*/
std::map<std::string, QVariant> NxsBuilderPlugin::applyFilter(
const QAction * action,
const RichParameterList & par,
MeshDocument &md,
const QAction* action,
const RichParameterList& par,
MeshDocument&,
unsigned int& /*postConditionMask*/,
vcg::CallBackPos *cb)
vcg::CallBackPos* cb)
{
switch(ID(action)) {
case FP_NXS_BUILDER :
vertexDisplacement(md, cb, par.getBool("UpdateNormals"), par.getAbsPerc("Displacement"));
break;
case FP_NXS_COMPRESS:
break;
default :
wrongActionCalled(action);
@ -182,35 +216,4 @@ std::map<std::string, QVariant> NxsBuilderPlugin::applyFilter(
return std::map<std::string, QVariant>();
}
void NxsBuilderPlugin::vertexDisplacement(
MeshDocument &md,
vcg::CallBackPos *cb,
bool updateNormals,
Scalarm max_displacement)
{
CMeshO &m = md.mm()->cm;
srand(time(NULL));
for(unsigned int i = 0; i< m.vert.size(); i++){
// Typical usage of the callback for showing a nice progress bar in the bottom.
// First parameter is a 0..100 number indicating percentage of completion, the second is an info string.
cb(100*i/m.vert.size(), "Randomly Displacing...");
Scalarm rndax = (Scalarm(2.0*rand())/RAND_MAX - 1.0 ) *max_displacement;
Scalarm rnday = (Scalarm(2.0*rand())/RAND_MAX - 1.0 ) *max_displacement;
Scalarm rndaz = (Scalarm(2.0*rand())/RAND_MAX - 1.0 ) *max_displacement;
m.vert[i].P() += Point3m(rndax,rnday,rndaz);
}
// Log function dump textual info in the lower part of the MeshLab screen.
log("Successfully displaced %i vertices",m.vn);
// to access to the parameters of the filter dialog simply use the getXXXX function of the FilterParameter Class
if(updateNormals){
vcg::tri::UpdateNormal<CMeshO>::PerVertexNormalizedPerFace(m);
}
vcg::tri::UpdateBounding<CMeshO>::Box(m);
}
MESHLAB_PLUGIN_NAME_EXPORTER(FilterSamplePlugin)
MESHLAB_PLUGIN_NAME_EXPORTER(NxsBuilderPlugin)

View File

@ -28,13 +28,11 @@
class NxsBuilderPlugin : public QObject, public FilterPlugin
{
//keep these three lines unchanged
Q_OBJECT
MESHLAB_PLUGIN_IID_EXPORTER(FILTER_PLUGIN_IID)
Q_INTERFACES(NxsBuilderPlugin)
Q_INTERFACES(FilterPlugin)
public:
//enum used to give an ID to every filter implemented in the plugin
enum FileterIds {
FP_NXS_BUILDER,
FP_NXS_COMPRESS
@ -58,13 +56,6 @@ public:
MeshDocument &md,
unsigned int& postConditionMask,
vcg::CallBackPos * cb);
private:
void vertexDisplacement(
MeshDocument &md,
vcg::CallBackPos *cb,
bool updateNormals,
Scalarm max_displacement);
};
#endif //MESHLAB_FILTER_NXS_BUILDER_H