/** @def This function initialize the mesh m in order to respect some prerequisites of the filter @param MeshModel* m - Pointer to the Mesh @return nothing */ void prepareMesh(MeshModel* m){ m->updateDataMask(MeshModel::MM_FACEFACETOPO); m->updateDataMask(MeshModel::MM_FACEMARK); m->updateDataMask(MeshModel::MM_FACECOLOR); m->updateDataMask(MeshModel::MM_VERTQUALITY); m->updateDataMask(MeshModel::MM_FACEQUALITY); m->updateDataMask(MeshModel::MM_FACENORMAL); tri::UnMarkAll(m->cm); //clean Mesh tri::Allocator<CMeshO>::CompactFaceVector(m->cm); tri::Clean<CMeshO>::RemoveUnreferencedVertex(m->cm); tri::Clean<CMeshO>::RemoveDuplicateVertex(m->cm); tri::Allocator<CMeshO>::CompactVertexVector(m->cm); tri::UpdateFlags<CMeshO>::FaceClear(m->cm); //update Mesh m->cm.vert.EnableVFAdjacency(); m->cm.face.EnableVFAdjacency(); tri::UpdateTopology<CMeshO>::FaceFace(m->cm); tri::UpdateTopology<CMeshO>::VertexFace(m->cm); tri::UpdateNormal<CMeshO>::PerFaceNormalized(m->cm); CMeshO::FaceIterator fi; for(fi=m->cm.face.begin();fi!=m->cm.face.end();++fi){ fi->Q()=0; } }
/** @def Compute the Normal Dust Amount Function per face of a Mesh m @param m MeshModel @param u CoordType dust direction @param k float @param s float @return nothing */ void ComputeNormalDustAmount(MeshModel* m,CMeshO::CoordType u,float k,float s){ CMeshO::FaceIterator fi; float d; for(fi=m->cm.face.begin();fi!=m->cm.face.end();++fi){ d=k/s+(1+k/s)*pow(fi->N().dot(u),s); fi->Q()=d; } }
/** @def This funcion @param @param @param @return ? */ bool GenerateParticles(MeshModel* m,std::vector<CMeshO::CoordType> &cpv,/*std::vector< Particle<CMeshO> > &dpv,*/int d,float threshold){ //Handler CMeshO::PerFaceAttributeHandle<float> eh=vcg::tri::Allocator<CMeshO>::GetPerFaceAttribute<float>(m->cm,std::string("exposure")); CMeshO::FaceIterator fi; CMeshO::CoordType p; cpv.clear(); //dpv.clear(); float r=1; float a0=0; float a=0; float a1=0; for(fi=m->cm.face.begin();fi!=m->cm.face.end();++fi){ int n_dust=0; a1=a0+r*eh[fi]; if(a1<0) a=0; if(a1>1) a=1; if(a1>=0 && a1<=1) a=a1; if(eh[fi]==1) a=1; else a=0; n_dust=(int)d*fi->Q()*a; for(int i=0;i<n_dust;i++){ p=RandomBaricentric(); CMeshO::CoordType n_p; n_p=fi->P(0)*p[0]+fi->P(1)*p[1]+fi->P(2)*p[2]; cpv.push_back(n_p); } fi->Q()=n_dust; } return true; }
void ColorizeMesh(MeshModel* m){ CMeshO::FaceIterator fi; float dirtiness; for(fi = m->cm.face.begin(); fi != m->cm.face.end(); ++fi){ dirtiness=fi->Q(); if(dirtiness==0){ fi->C()=Color4b(255,255,255,0); }else{ if(dirtiness>255) fi->C()=Color4b(0,0,0,0); else fi->C()=Color4b(255-dirtiness,255-dirtiness,255-dirtiness,0); } } tri::UpdateColor<CMeshO>::PerVertexFromFace(m->cm); }