From 4a7d71e7e70c41b31477f7e6daba563e3e4bf2e9 Mon Sep 17 00:00:00 2001 From: Nico Pietroni nicopietroni Date: Wed, 26 May 2010 09:03:19 +0000 Subject: [PATCH] first release version --- .../filter_isoparametrization/iso_transfer.h | 135 ++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 src/meshlabplugins/filter_isoparametrization/iso_transfer.h diff --git a/src/meshlabplugins/filter_isoparametrization/iso_transfer.h b/src/meshlabplugins/filter_isoparametrization/iso_transfer.h new file mode 100644 index 000000000..a5feaacd0 --- /dev/null +++ b/src/meshlabplugins/filter_isoparametrization/iso_transfer.h @@ -0,0 +1,135 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef _ISO_TRANSFER +#define _ISO_TRANSFER + +class IsoTransfer +{ + typedef vcg::GridStaticPtr TriMeshGrid; + typedef ParamMesh::CoordType CoordType; + typedef ParamMesh::ScalarType ScalarType; + TriMeshGrid TRGrid; + + void Clamp(CoordType &bary) + { + /* float eps=0.01;*/ + float sum=0; + int bigger=0; + int lower=0; + /* for (int i=0;i<3;i++) + { + if ((bary.V(i)-eps)) + bary.V(i)=0; + if ((bary.V(i)<1+eps)&&(bary.V(i)>1-eps)) + bary.V(i)=1; + + sum+=bary.V(i); + + if (bary.V(i)>bary.V(bigger)) + bigger=i; + if (bary.V(i)(1.0+eps)) + { + float diff=sum-1.0; + bary.V(bigger)-=diff; + } + else + if (sum<(1.0-eps)) + { + float diff=1.0-sum; + bary.V(lower)+=diff; + }*/ + for (int i=0;i<3;i++) + { + if (bary.V(i)<0) + bary.V(i)=0; + if (bary.V(i)>1) + bary.V(i)=1; + + sum+=bary.V(i); + + if (bary.V(i)>bary.V(bigger)) + bigger=i; + if (bary.V(i)(1.0)) + { + float diff=sum-1.0; + bary.V(bigger)-=diff; + } + else + if (sum<(1.0)) + { + float diff=1.0-sum; + bary.V(lower)+=diff; + } + } + + public: + template + void Transfer(IsoParametrization &IsoParam, + MeshType &to_assing) + { + ///put the mesh in the grid + typedef typename MeshType::ScalarType ScalarType; + vcg::tri::UpdateBounding::Box(*IsoParam.ParaMesh()); + vcg::tri::UpdateNormals::PerFaceNormalized(*IsoParam.ParaMesh()); + vcg::tri::UpdateNormals::PerVertexAngleWeighted(*IsoParam.ParaMesh()); + vcg::tri::UpdateNormals::NormalizeVertex(*IsoParam.ParaMesh()); + vcg::tri::UpdateEdges::Set(*IsoParam.ParaMesh()); + vcg::tri::UpdateFlags::FaceProjection(*IsoParam.ParaMesh()); + + TRGrid.Set(IsoParam.ParaMesh()->face.begin(),IsoParam.ParaMesh()->face.end()); + ScalarType maxDist=IsoParam.ParaMesh()->bbox.Diag(); + ///then for each vertex find the closest + for (int i=0;iIsD()) + { + ScalarType dist; + CoordType closest,norm,bary; + ParamMesh::FaceType * f=NULL; + f=GetClosestFace(*IsoParam.ParaMesh(),TRGrid,vert->P(), maxDist,dist,closest,norm,bary); + assert(f!=NULL); + + ///then find back the coordinates + if (!((bary.X()>=0)&&(bary.X()<=1)&& + (bary.Y()>=0)&&(bary.Y()<=1)&& + (bary.Z()>=0)&&(bary.Z()<=1))) + { + printf("%d,%3.3f,%3.3f,%3.3f",i,bary.X(),bary.Y(),bary.Z()); + system("pause"); + } + Clamp(bary); + int I; + vcg::Point2 UV; + IsoParam.Phi(f,bary,I,UV); + ///and finally set to the vertex + assert(I>=0); + vert->T().P()=UV; + vert->T().N()=I; + vert->Q()=(typename MeshType::ScalarType)I; + } + } + } + +}; + +#endif \ No newline at end of file