Improved float/double consistency removing some wrong Point3f and substitued with MeshType::CoordType.

Removed also the use of an additional mesh type called spheremesh to create sphere (the method require ff adj).
This commit is contained in:
Paolo Cignoni 2014-07-01 10:11:23 +00:00
parent 5e910a0058
commit c1d6d4e9bd
1 changed files with 40 additions and 33 deletions

View File

@ -866,7 +866,7 @@ void Disk(MeshType & m, int slices)
} }
template <class MeshType> template <class MeshType>
void OrientedDisk(MeshType &m, int slices, Point3f center, Point3f norm, float radius) void OrientedDisk(MeshType &m, int slices, typename MeshType::CoordType center, typename MeshType::CoordType norm, float radius)
{ {
Disk(m,slices); Disk(m,slices);
tri::UpdatePosition<MeshType>::Scale(m,radius); tri::UpdatePosition<MeshType>::Scale(m,radius);
@ -880,19 +880,22 @@ void OrientedDisk(MeshType &m, int slices, Point3f center, Point3f norm, float r
} }
template <class MeshType> template <class MeshType>
void OrientedEllipticPrism(MeshType & m, const Point3f origin, const Point3f end, float radius, float xScale, float yScale,bool capped, int slices=32, int stacks=4 ) void OrientedEllipticPrism(MeshType & m, const typename MeshType::CoordType origin, const typename MeshType::CoordType end, float radius, float xScale, float yScale,bool capped, int slices=32, int stacks=4 )
{ {
typedef typename MeshType::ScalarType ScalarType;
typedef typename MeshType::CoordType CoordType;
typedef Matrix44<typename MeshType::ScalarType> Matrix44x;
Cylinder(slices,stacks,m,capped); Cylinder(slices,stacks,m,capped);
tri::UpdatePosition<MeshType>::Translate(m,Point3f(0,1,0)); tri::UpdatePosition<MeshType>::Translate(m,CoordType(0,1,0));
tri::UpdatePosition<MeshType>::Scale(m,Point3f(1,0.5f,1)); tri::UpdatePosition<MeshType>::Scale(m,CoordType(1,0.5f,1));
tri::UpdatePosition<MeshType>::Scale(m,Point3f(xScale,1.0f,yScale)); tri::UpdatePosition<MeshType>::Scale(m,CoordType(xScale,1.0f,yScale));
float height = Distance(origin,end); float height = Distance(origin,end);
tri::UpdatePosition<MeshType>::Scale(m,Point3f(radius,height,radius)); tri::UpdatePosition<MeshType>::Scale(m,CoordType(radius,height,radius));
Point3f norm = end-origin; CoordType norm = end-origin;
float angleRad = Angle(Point3f(0,1,0),norm); ScalarType angleRad = Angle(CoordType(0,1,0),norm);
Point3f axis = Point3f(0,1,0)^norm; CoordType axis = CoordType(0,1,0)^norm;
Matrix44f rotM; Matrix44x rotM;
rotM.SetRotateRad(angleRad,axis); rotM.SetRotateRad(angleRad,axis);
tri::UpdatePosition<MeshType>::Matrix(m,rotM); tri::UpdatePosition<MeshType>::Matrix(m,rotM);
tri::UpdatePosition<MeshType>::Translate(m,origin); tri::UpdatePosition<MeshType>::Translate(m,origin);
@ -900,7 +903,7 @@ void OrientedEllipticPrism(MeshType & m, const Point3f origin, const Point3f end
} }
template <class MeshType> template <class MeshType>
void OrientedCylinder(MeshType & m, const Point3f origin, const Point3f end, float radius, bool capped, int slices=32, int stacks=4 ) void OrientedCylinder(MeshType & m, const typename MeshType::CoordType origin, const typename MeshType::CoordType end, float radius, bool capped, int slices=32, int stacks=4 )
{ {
OrientedEllipticPrism(m,origin,end,radius,1.0f,1.0f,capped,slices,stacks); OrientedEllipticPrism(m,origin,end,radius,1.0f,1.0f,capped,slices,stacks);
} }
@ -982,7 +985,7 @@ void BuildPrismFaceShell(MeshType &mIn, MeshType &mOut, float height=0, float in
tri::UpdateFlags<MeshType>::FaceClearV(mIn); tri::UpdateFlags<MeshType>::FaceClearV(mIn);
for(size_t i=0;i<mIn.face.size();++i) if(!mIn.face[i].IsV()) for(size_t i=0;i<mIn.face.size();++i) if(!mIn.face[i].IsV())
{ {
_SphMesh faceM; MeshType faceM;
std::vector<VertexPointer> vertVec; std::vector<VertexPointer> vertVec;
std::vector<FacePointer> faceVec; std::vector<FacePointer> faceVec;
tri::PolygonSupport<MeshType,MeshType>::ExtractPolygon(&(mIn.face[i]),vertVec,faceVec); tri::PolygonSupport<MeshType,MeshType>::ExtractPolygon(&(mIn.face[i]),vertVec,faceVec);
@ -1000,41 +1003,44 @@ void BuildPrismFaceShell(MeshType &mIn, MeshType &mOut, float height=0, float in
bary/=float(faceVec.size()); bary/=float(faceVec.size());
// Add vertices (alternated top and bottom) // Add vertices (alternated top and bottom)
tri::Allocator<_SphMesh>::AddVertex(faceM, bary-nf); tri::Allocator<MeshType>::AddVertex(faceM, bary-nf);
tri::Allocator<_SphMesh>::AddVertex(faceM, bary+nf); tri::Allocator<MeshType>::AddVertex(faceM, bary+nf);
for(size_t j=0;j<vn;++j){ for(size_t j=0;j<vn;++j){
CoordType delta = (vertVec[j]->P() - bary); CoordType delta = (vertVec[j]->P() - bary);
delta.Normalize(); delta.Normalize();
delta = delta*inset; delta = delta*inset;
tri::Allocator<_SphMesh>::AddVertex(faceM, vertVec[j]->P()-delta-nf); tri::Allocator<MeshType>::AddVertex(faceM, vertVec[j]->P()-delta-nf);
tri::Allocator<_SphMesh>::AddVertex(faceM, vertVec[j]->P()-delta+nf); tri::Allocator<MeshType>::AddVertex(faceM, vertVec[j]->P()-delta+nf);
} }
// Build top and bottom faces // Build top and bottom faces
for(size_t j=0;j<vn;++j) for(size_t j=0;j<vn;++j)
tri::Allocator<_SphMesh>::AddFace(faceM, 0, 2+(j+0)*2, 2+((j+1)%vn)*2 ); tri::Allocator<MeshType>::AddFace(faceM, 0, 2+(j+0)*2, 2+((j+1)%vn)*2 );
for(size_t j=0;j<vn;++j) for(size_t j=0;j<vn;++j)
tri::Allocator<_SphMesh>::AddFace(faceM, 1, 3+((j+1)%vn)*2, 3+(j+0)*2 ); tri::Allocator<MeshType>::AddFace(faceM, 1, 3+((j+1)%vn)*2, 3+(j+0)*2 );
// Build side strip // Build side strip
for(size_t j=0;j<vn;++j){ for(size_t j=0;j<vn;++j){
size_t j0=j; size_t j0=j;
size_t j1=(j+1)%vn; size_t j1=(j+1)%vn;
tri::Allocator<_SphMesh>::AddFace(faceM, 2+ j0*2 + 0 , 2+ j0*2+1, 2+j1*2+0); tri::Allocator<MeshType>::AddFace(faceM, 2+ j0*2 + 0 , 2+ j0*2+1, 2+j1*2+0);
tri::Allocator<_SphMesh>::AddFace(faceM, 2+ j0*2 + 1 , 2+ j1*2+1, 2+j1*2+0); tri::Allocator<MeshType>::AddFace(faceM, 2+ j0*2 + 1 , 2+ j1*2+1, 2+j1*2+0);
} }
for(size_t j=0;j<2*vn;++j) for(size_t j=0;j<2*vn;++j)
faceM.face[j].SetS(); faceM.face[j].SetS();
tri::UpdateTopology<_SphMesh>::FaceFace(faceM); if(smoothFlag)
tri::UpdateFlags<_SphMesh>::FaceBorderFromFF(faceM); {
tri::Refine(faceM, MidPoint<_SphMesh>(&faceM),0,true); tri::UpdateTopology<MeshType>::FaceFace(faceM);
tri::Refine(faceM, MidPoint<_SphMesh>(&faceM),0,true); tri::UpdateFlags<MeshType>::FaceBorderFromFF(faceM);
tri::UpdateSelection<_SphMesh>::VertexFromFaceStrict(faceM); tri::Refine(faceM, MidPoint<MeshType>(&faceM),0,true);
tri::Smooth<_SphMesh>::VertexCoordLaplacian(faceM,2,true,true); tri::Refine(faceM, MidPoint<MeshType>(&faceM),0,true);
tri::UpdateSelection<MeshType>::VertexFromFaceStrict(faceM);
tri::Smooth<MeshType>::VertexCoordLaplacian(faceM,2,true,true);
}
tri::Append<MeshType,_SphMesh>::Mesh(mOut,faceM); tri::Append<MeshType,MeshType>::Mesh(mOut,faceM);
} // end main loop for each face; } // end main loop for each face;
} }
@ -1061,23 +1067,24 @@ void BuildSphereVertexShell(MeshType &mIn, MeshType &mOut, float radius=0, int r
if(radius==0) radius = mIn.bbox.Diag()/100.0f; if(radius==0) radius = mIn.bbox.Diag()/100.0f;
for(size_t i=0;i<mIn.vert.size();++i) for(size_t i=0;i<mIn.vert.size();++i)
{ {
_SphMesh mSph; MeshType mSph;
tri::Sphere(mSph,recDiv); tri::Sphere(mSph,recDiv);
tri::UpdatePosition<_SphMesh>::Scale(mSph,radius); tri::UpdatePosition<MeshType>::Scale(mSph,radius);
tri::UpdatePosition<_SphMesh>::Translate(mSph,mIn.vert[i].P()); tri::UpdatePosition<MeshType>::Translate(mSph,mIn.vert[i].P());
tri::Append<MeshType,_SphMesh>::Mesh(mOut,mSph); tri::Append<MeshType,MeshType>::Mesh(mOut,mSph);
} }
} }
template <class MeshType> template <class MeshType>
void BuildCylinderVertexShell(MeshType &mIn, MeshType &mOut, float radius=0, float height=0 ) void BuildCylinderVertexShell(MeshType &mIn, MeshType &mOut, float radius=0, float height=0 )
{ {
typedef typename MeshType::CoordType CoordType;
if(radius==0) radius = mIn.bbox.Diag()/100.0f; if(radius==0) radius = mIn.bbox.Diag()/100.0f;
if(height==0) height = mIn.bbox.Diag()/200.0f; if(height==0) height = mIn.bbox.Diag()/200.0f;
for(size_t i=0;i<mIn.vert.size();++i) for(size_t i=0;i<mIn.vert.size();++i)
{ {
Point3f p = mIn.vert[i].P(); CoordType p = mIn.vert[i].P();
Point3f n = mIn.vert[i].N().Normalize(); CoordType n = mIn.vert[i].N().Normalize();
MeshType mCyl; MeshType mCyl;
tri::OrientedCylinder(mCyl,p-n*height,p+n*height,radius,true); tri::OrientedCylinder(mCyl,p-n*height,p+n*height,radius,true);