From 1bc6afaafdc5c56994bda8549d50b2fdff9860e9 Mon Sep 17 00:00:00 2001 From: jmespadero Date: Fri, 28 Jul 2023 13:42:38 +0200 Subject: [PATCH 1/3] Add rnd() and randInt(n) functions to muparse Add two functions to muParse to generate random numbers * rnd() will generate a random double value in [0.0 .. 1.0) interval * randInt(n) will generate a random integer value in [0 .. n) interval Those functions may be used to generate noise custom noise algorithm that can be aplied to geometry, colors, normals, etc. or select a random number of vertex/faces than can be erased/processed in posterior filters. --- .../filter_func/filter_func.cpp | 56 ++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/src/meshlabplugins/filter_func/filter_func.cpp b/src/meshlabplugins/filter_func/filter_func.cpp index 34c693fa6..329aba22c 100644 --- a/src/meshlabplugins/filter_func/filter_func.cpp +++ b/src/meshlabplugins/filter_func/filter_func.cpp @@ -33,6 +33,20 @@ using namespace mu; using namespace vcg; +std::random_device randomDev; +std::default_random_engine rndEngine(randomDev()); +//Function to generate a random double number in [0..1) interval +double ML_Rnd() { return std::generate_canonical(rndEngine); } +//Function to generate a random integer number in [0..a) interval +double ML_RandInt(const double a) { return std::floor(a*MyRnd()); } + +//Add rnd() and randint() custom functions to a mu::Parser +void setCustomFunctions(mu::Parser& p) +{ + p.DefineFun("rnd", ML_Rnd); + p.DefineFun("randInt", ML_RandInt); +} + // Constructor FilterFunctionPlugin::FilterFunctionPlugin() { @@ -703,7 +717,9 @@ std::map FilterFunctionPlugin::applyFilter( // muparser initialization and explicitly define parser variables Parser p; + setPerVertexVariables(p, m.cm); + setCustomFunctions(p); // set expression inserted by user as string (required by muparser) p.SetExpr(wexpr); @@ -749,7 +765,8 @@ std::map FilterFunctionPlugin::applyFilter( // muparser initialization and explicitly define parser variables Parser p; setPerFaceVariables(p, m.cm); - + setCustomFunctions(p); + // set expression inserted by user as string (required by muparser) p.SetExpr(conversion::fromStringToWString(select.toStdString())); @@ -817,12 +834,16 @@ std::map FilterFunctionPlugin::applyFilter( // muparser initialization and explicitly define parser variables // function for x,y and z must use different parser and variables Parser p1, p2, p3, p4; - setPerVertexVariables(p1, m.cm); setPerVertexVariables(p2, m.cm); setPerVertexVariables(p3, m.cm); setPerVertexVariables(p4, m.cm); + setCustomFunctions(p1); + setCustomFunctions(p2); + setCustomFunctions(p3); + setCustomFunctions(p4); + p1.SetExpr(conversion::fromStringToWString(func_x)); p2.SetExpr(conversion::fromStringToWString(func_y)); p3.SetExpr(conversion::fromStringToWString(func_z)); @@ -918,6 +939,9 @@ std::map FilterFunctionPlugin::applyFilter( Parser p; setPerVertexVariables(p, m.cm); + //Add rnd() and randInt() internal functions + setCustomFunctions(p); + // set expression to calc with parser p.SetExpr(conversion::fromStringToWString(func_q)); @@ -977,6 +1001,8 @@ std::map FilterFunctionPlugin::applyFilter( Parser pu, pv; setPerVertexVariables(pu, m.cm); setPerVertexVariables(pv, m.cm); + setCustomFunctions(pu); + setCustomFunctions(pv); // set expression to calc with parser #ifdef _UNICODE @@ -1035,6 +1061,12 @@ std::map FilterFunctionPlugin::applyFilter( setPerFaceVariables(pv1, m.cm); setPerFaceVariables(pu2, m.cm); setPerFaceVariables(pv2, m.cm); + setCustomFunctions(pu0); + setCustomFunctions(pv0); + setCustomFunctions(pu1); + setCustomFunctions(pv1); + setCustomFunctions(pu2); + setCustomFunctions(pv2); // set expression to calc with parser pu0.SetExpr(conversion::fromStringToWString(func_u0)); @@ -1084,6 +1116,10 @@ std::map FilterFunctionPlugin::applyFilter( setPerFaceVariables(p_nx, m.cm); setPerFaceVariables(p_ny, m.cm); setPerFaceVariables(p_nz, m.cm); + setCustomFunctions(p_nx); + setCustomFunctions(p_ny); + setCustomFunctions(p_nz); + p_nx.SetExpr(conversion::fromStringToWString(func_nx)); p_ny.SetExpr(conversion::fromStringToWString(func_ny)); p_nz.SetExpr(conversion::fromStringToWString(func_nz)); @@ -1156,6 +1192,10 @@ std::map FilterFunctionPlugin::applyFilter( setPerFaceVariables(p2, m.cm); setPerFaceVariables(p3, m.cm); setPerFaceVariables(p4, m.cm); + setCustomFunctions(p1); + setCustomFunctions(p2); + setCustomFunctions(p3); + setCustomFunctions(p4); p1.SetExpr(conversion::fromStringToWString(func_r)); p2.SetExpr(conversion::fromStringToWString(func_g)); @@ -1229,6 +1269,7 @@ std::map FilterFunctionPlugin::applyFilter( // muparser initialization and define custom variables Parser pf; setPerFaceVariables(pf, m.cm); + setCustomFunctions(pf); // set expression to calc with parser pf.SetExpr(conversion::fromStringToWString(func_q)); @@ -1288,6 +1329,7 @@ std::map FilterFunctionPlugin::applyFilter( Parser p; setPerVertexVariables(p, m.cm); + setCustomFunctions(p); p.SetExpr(conversion::fromStringToWString(expr)); @@ -1340,6 +1382,7 @@ std::map FilterFunctionPlugin::applyFilter( h = tri::Allocator::AddPerFaceAttribute(m.cm, name); Parser p; setPerFaceVariables(p, m.cm); + setCustomFunctions(p); p.SetExpr(conversion::fromStringToWString(expr)); time_t start = clock(); @@ -1386,6 +1429,10 @@ std::map FilterFunctionPlugin::applyFilter( setPerVertexVariables(p_x, m.cm); setPerVertexVariables(p_y, m.cm); setPerVertexVariables(p_z, m.cm); + setCustomFunctions(p_x); + setCustomFunctions(p_y); + setCustomFunctions(p_z); + p_x.SetExpr(conversion::fromStringToWString(x_expr)); p_y.SetExpr(conversion::fromStringToWString(y_expr)); p_z.SetExpr(conversion::fromStringToWString(z_expr)); @@ -1445,6 +1492,9 @@ std::map FilterFunctionPlugin::applyFilter( setPerFaceVariables(p_x, m.cm); setPerFaceVariables(p_y, m.cm); setPerFaceVariables(p_z, m.cm); + setCustomFunctions(p_x); + setCustomFunctions(p_y); + setCustomFunctions(p_z); p_x.SetExpr(conversion::fromStringToWString(x_expr)); p_y.SetExpr(conversion::fromStringToWString(y_expr)); p_z.SetExpr(conversion::fromStringToWString(z_expr)); @@ -1526,6 +1576,8 @@ std::map FilterFunctionPlugin::applyFilter( Parser p; double x, y, z; + setCustomFunctions(p); + p.DefineVar(conversion::fromStringToWString("x"), &x); p.DefineVar(conversion::fromStringToWString("y"), &y); p.DefineVar(conversion::fromStringToWString("z"), &z); From 07cb607f582feda2b9e05c1eeb6afa213ad07b15 Mon Sep 17 00:00:00 2001 From: jmespadero Date: Fri, 28 Jul 2023 13:47:32 +0200 Subject: [PATCH 2/3] include ramdom --- src/meshlabplugins/filter_func/filter_func.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/meshlabplugins/filter_func/filter_func.cpp b/src/meshlabplugins/filter_func/filter_func.cpp index 329aba22c..ffb45dc8b 100644 --- a/src/meshlabplugins/filter_func/filter_func.cpp +++ b/src/meshlabplugins/filter_func/filter_func.cpp @@ -22,8 +22,8 @@ ****************************************************************************/ #include "filter_func.h" +#include #include - #include #include From 8a51f54ef1a665a323b62b51856bd2f33530c2cc Mon Sep 17 00:00:00 2001 From: jmespadero Date: Fri, 28 Jul 2023 14:16:31 +0200 Subject: [PATCH 3/3] include rnd() and randInt() functions to muparser small bugfix --- src/meshlabplugins/filter_func/filter_func.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/meshlabplugins/filter_func/filter_func.cpp b/src/meshlabplugins/filter_func/filter_func.cpp index ffb45dc8b..0acca0fed 100644 --- a/src/meshlabplugins/filter_func/filter_func.cpp +++ b/src/meshlabplugins/filter_func/filter_func.cpp @@ -38,7 +38,7 @@ std::default_random_engine rndEngine(randomDev()); //Function to generate a random double number in [0..1) interval double ML_Rnd() { return std::generate_canonical(rndEngine); } //Function to generate a random integer number in [0..a) interval -double ML_RandInt(const double a) { return std::floor(a*MyRnd()); } +double ML_RandInt(const double a) { return std::floor(a*ML_Rnd()); } //Add rnd() and randint() custom functions to a mu::Parser void setCustomFunctions(mu::Parser& p)