#pragma once#include<vnl/vnl_vector_fixed.h>#include"ParticleDomain.h"#include"DomainType.h"namespaceshapeworks{classMeshWrapper{public:typedeftypenameParticleDomain::PointTypePointType;typedeftypenameParticleDomain::GradNTypeGradNType;// Computed distance between points. If out_grad != nullptr, returns the gradient of the distance in that vectorvirtualdoubleComputeDistance(constPointType&pointa,intidx_a,constPointType&pointb,intidx_b,vnl_vector_fixed<double,3>*out_grad=nullptr)const=0;// Return true if the distance between point a and b is within test_distvirtualboolIsWithinDistance(constPointType&a,intidx_a,constPointType&b,intidx_b,doubletest_dist,double&dist)const=0;// Returns updated point position after applying the update vector to the initial position.virtualPointTypeGeodesicWalk(PointTypepointa,intidx,vnl_vector_fixed<double,DIMENSION>vector)const=0;// Returns a point on the mesh.virtualPointTypeGetPointOnMesh()const=0;// Returns minimum corner of bounding box.virtualconstPointType&GetMeshLowerBound()const=0;// Returns maximum corner of bounding box.virtualconstPointType&GetMeshUpperBound()const=0;virtualvnl_vector_fixed<double,DIMENSION>ProjectVectorToSurfaceTangent(constPointType&pointa,intidx,vnl_vector_fixed<double,DIMENSION>&vector)const=0;virtualvnl_vector_fixed<float,DIMENSION>SampleNormalAtPoint(PointTypep,intidx)const=0;virtualGradNTypeSampleGradNAtPoint(PointTypep,intidx)const=0;// Returns closest point on mesh to pointa.virtualPointTypeSnapToMesh(PointTypepointa,intidx)const=0;virtualvoidInvalidateParticle(intidx){};virtualboolIsGeodesicsEnabled()const=0;virtualvtkSmartPointer<vtkPolyData>GetPolydata()const=0;};}