/** @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 function compute the Surface Exposure per face of a Mesh m @param MeshModel* m - Pointer to the new mesh @param int r - scaling factor @param int n_ray - number of rays emitted @return nothing */ void ComputeSurfaceExposure(MeshModel* m,int r,int n_ray){ CMeshO::PerFaceAttributeHandle<float> eh=vcg::tri::Allocator<CMeshO>::AddPerFaceAttribute<float>(m->cm,std::string("exposure")); float dh=1.2; float exp=0; float di=0; float xi=0; CMeshO::FacePointer face; CMeshO::CoordType p_c; MetroMeshFaceGrid f_grid; f_grid.Set(m->cm.face.begin(),m->cm.face.end()); MarkerFace markerFunctor; markerFunctor.SetMesh(&(m->cm)); RayTriangleIntersectionFunctor<false> RSectFunct; CMeshO::FaceIterator fi; for(fi=m->cm.face.begin();fi!=m->cm.face.end();++fi){ xi=0; eh[fi]=0; for(int i=0;i<n_ray;i++){ //For every f_face get the central point p_c=fromBarCoords(RandomBaricentric(),&*fi); //Create a ray with p_c as origin and direction N p_c=p_c+NormalizedNormal(*fi)*0.1; Ray3<float> ray=Ray3<float>(p_c,fi->N()); di=0; face=0; face=f_grid.DoRay<RayTriangleIntersectionFunctor<false>,MarkerFace>(RSectFunct,markerFunctor,ray,1000,di); if(di!=0){ xi=xi+(dh/(dh-di)); } } exp=1-(xi/n_ray); eh[fi]=exp; } }