bool FilterScreenedPoissonPlugin::applyFilter( const QString& filterName,MeshDocument& md,EnvWrap& env, vcg::CallBackPos* cb) { if (filterName == "Screened Poisson Surface Reconstruction") { MeshModel *mm =md.mm(); MeshModel *pm =md.addNewMesh("","Poisson mesh",false); md.setVisible(pm->id(),false); pm->updateDataMask(MeshModel::MM_VERTQUALITY); PoissonParam<Scalarm> pp; MeshModelPointStream<Scalarm> meshStream(mm->cm); MeshDocumentPointStream<Scalarm> documentStream(md); pp.MaxDepthVal = env.evalInt("depth"); pp.FullDepthVal = env.evalInt("fullDepth"); pp.CGDepthVal= env.evalInt("cgDepth"); pp.ScaleVal = env.evalFloat("scale"); pp.SamplesPerNodeVal = env.evalFloat("samplesPerNode"); pp.PointWeightVal = env.evalFloat("pointWeight"); pp.ItersVal = env.evalInt("iters"); pp.ConfidenceFlag = env.evalBool("confidence"); pp.NormalWeightsFlag = env.evalBool("nWeights"); pp.DensityFlag = true; if(env.evalBool("visibleLayer")) { MeshModel *m=0; while(m=md.nextVisibleMesh(m)) PoissonClean(m->cm, (pp.ConfidenceFlag || pp.NormalWeightsFlag)); Execute<Scalarm>(&documentStream,pm->cm,pp,cb); } else { PoissonClean(mm->cm, (pp.ConfidenceFlag || pp.NormalWeightsFlag)); Execute<Scalarm>(&meshStream,pm->cm,pp,cb); } pm->UpdateBoxAndNormals(); md.setVisible(pm->id(),true); return true; } return false; }
bool SampleXMLFilterPlugin::applyFilter( const QString& filterName,MeshDocument& md,EnvWrap& env, vcg::CallBackPos* cb) { if (filterName == "Random vertex displacement") { MeshModel &m=*md.mm(); srand(time(NULL)); const float max_displacement =env.evalFloat("Displacement"); for(unsigned int i = 0; i< m.cm.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.cm.vert.size(), "Randomly Displacing..."); float rndax = (float(2.0f*rand())/RAND_MAX - 1.0f ) *max_displacement; float rnday = (float(2.0f*rand())/RAND_MAX - 1.0f ) *max_displacement; float rndaz = (float(2.0f*rand())/RAND_MAX - 1.0f ) *max_displacement; m.cm.vert[i].P() += vcg::Point3f(rndax,rnday,rndaz); //if ( i % 1000 == 0) QList<int> meshlist; meshlist << m.id(); md.updateRenderStateMeshes(meshlist,int(MeshModel::MM_VERTCOORD)); if (intteruptreq) return true; } //// Log function dump textual info in the lower part of the MeshLab screen. Log("Successfully displaced %i vertices",m.cm.vn); //// to access to the parameters of the filter dialog simply use the getXXXX function of the FilterParameter Class if(env.evalBool("UpdateNormals")) vcg::tri::UpdateNormals<CMeshO>::PerVertexNormalizedPerFace(m.cm); vcg::tri::UpdateBounding<CMeshO>::Box(m.cm); return true; } return false; }