Added support for PLY saving and reading of the radius property (useful for point clouds)
This commit is contained in:
parent
915a7b40a1
commit
666b0996ff
|
@ -294,6 +294,13 @@ static int Save(SaveMeshType &m, const char * filename, bool binary, PlyInfo &p
|
|||
);
|
||||
}
|
||||
|
||||
if( tri::HasPerVertexRadius(m) && (pi.mask & Mask::IOM_VERTRADIUS) )
|
||||
{
|
||||
fprintf(fpout,
|
||||
"property float radius\n"
|
||||
);
|
||||
}
|
||||
|
||||
for(i=0;i<pi.vdn;i++)
|
||||
fprintf(fpout,"property %s %s\n",pi.VertexData[i].stotypename(),pi.VertexData[i].propname);
|
||||
|
||||
|
@ -454,6 +461,9 @@ static int Save(SaveMeshType &m, const char * filename, bool binary, PlyInfo &p
|
|||
if( m.HasPerVertexQuality() && (pi.mask & Mask::IOM_VERTQUALITY) )
|
||||
fwrite(&( vp->Q() ),sizeof(float),1,fpout);
|
||||
|
||||
if( HasPerVertexRadius(m) && (pi.mask & Mask::IOM_VERTRADIUS) )
|
||||
fwrite(&( vp->R() ),sizeof(float),1,fpout);
|
||||
|
||||
|
||||
for(i=0;i<pi.vdn;i++)
|
||||
{
|
||||
|
@ -486,6 +496,9 @@ static int Save(SaveMeshType &m, const char * filename, bool binary, PlyInfo &p
|
|||
if( m.HasPerVertexQuality() && (pi.mask & Mask::IOM_VERTQUALITY) )
|
||||
fprintf(fpout,"%g ",vp->Q());
|
||||
|
||||
if( HasPerVertexRadius(m) && (pi.mask & Mask::IOM_VERTRADIUS) )
|
||||
fprintf(fpout,"%g ",vp->R());
|
||||
|
||||
for(i=0;i<pi.vdn;i++)
|
||||
{
|
||||
float tf(0); double td(0);
|
||||
|
@ -722,6 +735,7 @@ static const char *ErrorMsg(int error)
|
|||
capability |= vcg::tri::io::Mask::IOM_VERTCOLOR ;
|
||||
capability |= vcg::tri::io::Mask::IOM_VERTQUALITY ;
|
||||
capability |= vcg::tri::io::Mask::IOM_VERTNORMAL ;
|
||||
capability |= vcg::tri::io::Mask::IOM_VERTRADIUS ;
|
||||
capability |= vcg::tri::io::Mask::IOM_VERTTEXCOORD ;
|
||||
capability |= vcg::tri::io::Mask::IOM_FACEINDEX ;
|
||||
capability |= vcg::tri::io::Mask::IOM_FACEFLAGS ;
|
||||
|
|
|
@ -243,6 +243,8 @@ struct LoadPly_VertAux
|
|||
unsigned char g;
|
||||
unsigned char b;
|
||||
unsigned char data[MAX_USER_DATA];
|
||||
float radius;
|
||||
float u,v,w;
|
||||
};
|
||||
|
||||
// Struttura ausiliaria caricamento camera
|
||||
|
@ -273,9 +275,10 @@ struct LoadPly_Camera
|
|||
float k4;
|
||||
};
|
||||
|
||||
#define _VERTDESC_LAST_ 19
|
||||
static const PropDescriptor &VertDesc(int i)
|
||||
{
|
||||
static const PropDescriptor pv[15]={
|
||||
static const PropDescriptor pv[_VERTDESC_LAST_]={
|
||||
/*00*/ {"vertex", "x", ply::T_FLOAT, PlyType<ScalarType>(),offsetof(LoadPly_VertAux<ScalarType>,p),0,0,0,0,0 ,0},
|
||||
/*01*/ {"vertex", "y", ply::T_FLOAT, PlyType<ScalarType>(),offsetof(LoadPly_VertAux<ScalarType>,p) + sizeof(ScalarType),0,0,0,0,0 ,0},
|
||||
/*02*/ {"vertex", "z", ply::T_FLOAT, PlyType<ScalarType>(),offsetof(LoadPly_VertAux<ScalarType>,p) + 2*sizeof(ScalarType),0,0,0,0,0 ,0},
|
||||
|
@ -288,9 +291,13 @@ static const PropDescriptor &VertDesc(int i)
|
|||
/*09*/ {"vertex", "diffuse_green", ply::T_UCHAR, ply::T_UCHAR, offsetof(LoadPly_VertAux<ScalarType>,g),0,0,0,0,0 ,0},
|
||||
/*10*/ {"vertex", "diffuse_blue" , ply::T_UCHAR, ply::T_UCHAR, offsetof(LoadPly_VertAux<ScalarType>,b),0,0,0,0,0 ,0},
|
||||
/*11*/ {"vertex", "confidence",ply::T_FLOAT, ply::T_FLOAT, offsetof(LoadPly_VertAux<ScalarType>,q),0,0,0,0,0 ,0},
|
||||
/*12*/ {"vertex", "nx", ply::T_FLOAT, PlyType<ScalarType>(),offsetof(LoadPly_VertAux<ScalarType>,n),0,0,0,0,0 ,0},
|
||||
/*13*/ {"vertex", "ny", ply::T_FLOAT, PlyType<ScalarType>(),offsetof(LoadPly_VertAux<ScalarType>,n) + sizeof(ScalarType),0,0,0,0,0 ,0},
|
||||
/*12*/ {"vertex", "nx", ply::T_FLOAT, PlyType<ScalarType>(),offsetof(LoadPly_VertAux<ScalarType>,n) ,0,0,0,0,0 ,0},
|
||||
/*13*/ {"vertex", "ny", ply::T_FLOAT, PlyType<ScalarType>(),offsetof(LoadPly_VertAux<ScalarType>,n) + 1*sizeof(ScalarType),0,0,0,0,0 ,0},
|
||||
/*14*/ {"vertex", "nz", ply::T_FLOAT, PlyType<ScalarType>(),offsetof(LoadPly_VertAux<ScalarType>,n) + 2*sizeof(ScalarType),0,0,0,0,0 ,0},
|
||||
/*15*/ {"vertex", "radius", ply::T_FLOAT, ply::T_FLOAT, offsetof(LoadPly_VertAux<ScalarType>,radius),0,0,0,0,0 ,0},
|
||||
/*16*/ {"vertex", "texture_u", ply::T_FLOAT, ply::T_FLOAT, offsetof(LoadPly_VertAux<ScalarType>,u),0,0,0,0,0 ,0},
|
||||
/*17*/ {"vertex", "texture_v", ply::T_FLOAT, ply::T_FLOAT, offsetof(LoadPly_VertAux<ScalarType>,v),0,0,0,0,0 ,0},
|
||||
/*18*/ {"vertex", "texture_w", ply::T_FLOAT, ply::T_FLOAT, offsetof(LoadPly_VertAux<ScalarType>,w),0,0,0,0,0 ,0},
|
||||
};
|
||||
return pv[i];
|
||||
}
|
||||
|
@ -551,7 +558,11 @@ static int Open( OpenMeshType &m, const char * filename, PlyInfo &pi )
|
|||
pi.mask |= Mask::IOM_VERTCOLOR;
|
||||
}
|
||||
}
|
||||
|
||||
if( VertexType::HasRadius() )
|
||||
{
|
||||
pf.AddToRead(VertDesc(15));
|
||||
pi.mask |= Mask::IOM_VERTRADIUS;
|
||||
}
|
||||
// se ci sono i flag per vertice ci devono essere anche i flag per faccia
|
||||
if( pf.AddToRead(FaceDesc(1))!=-1 )
|
||||
pi.mask |= Mask::IOM_FACEFLAGS;
|
||||
|
@ -726,6 +737,8 @@ static int Open( OpenMeshType &m, const char * filename, PlyInfo &pi )
|
|||
(*vi).C()[2] = va.b;
|
||||
(*vi).C()[3] = 255;
|
||||
}
|
||||
if( pi.mask & Mask::IOM_VERTRADIUS )
|
||||
(*vi).R() = va.radius;
|
||||
|
||||
|
||||
for(int k=0;k<pi.vdn;k++)
|
||||
|
@ -1124,6 +1137,7 @@ static bool LoadMask(const char * filename, int &mask, PlyInfo &pi)
|
|||
if( pf.AddToRead(VertDesc(3))!=-1 ) mask |= Mask::IOM_VERTFLAGS;
|
||||
if( pf.AddToRead(VertDesc(4))!=-1 ) mask |= Mask::IOM_VERTQUALITY;
|
||||
if( pf.AddToRead(VertDesc(11))!=-1 ) mask |= Mask::IOM_VERTQUALITY;
|
||||
if( pf.AddToRead(VertDesc(15))!=-1 ) mask |= Mask::IOM_VERTRADIUS;
|
||||
if( ( pf.AddToRead(VertDesc(5))!=-1 ) &&
|
||||
( pf.AddToRead(VertDesc(6))!=-1 ) &&
|
||||
( pf.AddToRead(VertDesc(7))!=-1 ) ) mask |= Mask::IOM_VERTCOLOR;
|
||||
|
|
Loading…
Reference in New Issue