import_ply.h
Go to the documentation of this file.
00001 /****************************************************************************
00002 * VCGLib                                                            o o     *
00003 * Visual and Computer Graphics Library                            o     o   *
00004 *                                                                _   O  _   *
00005 * Copyright(C) 2004                                                \/)\/    *
00006 * Visual Computing Lab                                            /\/|      *
00007 * ISTI - Italian National Research Council                           |      *
00008 *                                                                    \      *
00009 * All rights reserved.                                                      *
00010 *                                                                           *
00011 * This program is free software; you can redistribute it and/or modify      *   
00012 * it under the terms of the GNU General Public License as published by      *
00013 * the Free Software Foundation; either version 2 of the License, or         *
00014 * (at your option) any later version.                                       *
00015 *                                                                           *
00016 * This program is distributed in the hope that it will be useful,           *
00017 * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
00018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             *
00019 * GNU General Public License (http://www.gnu.org/licenses/gpl.txt)          *
00020 * for more details.                                                         *
00021 *                                                                           *
00022 ****************************************************************************/
00023 /****************************************************************************
00024   History
00025 
00026 $Log: not supported by cvs2svn $
00027 Revision 1.1  2004/06/03 13:16:32  ganovelli
00028 created
00029 
00030 ****************************************************************************/
00031 #ifndef __VCGLIB_TETRAIMPORTERPLY
00032 #define __VCGLIB_TETRAIMPORTERPLY
00033 
00034 #include<wrap/callback.h>
00035 #include<wrap/ply/plylib.h>
00036 #include<wrap/ply/io_mask.h>
00037 #include<wrap/io_tetramesh/io_ply.h>
00038 #include<vcg/complex/tetramesh/allocate.h>
00039 
00040 
00041 
00042 namespace vcg {
00043 namespace tetra {
00044 namespace io {
00045 
00046 template <class TYPE>
00047 int PlyType ()  { return 0;}
00048 
00049 template <> int PlyType <float >()  { return ply::T_FLOAT; }
00050 template <> int PlyType <double>()  { return ply::T_DOUBLE; }
00051 template <> int PlyType <int   >()  { return ply::T_INT; } 
00052 template <> int PlyType <short >()  { return ply::T_SHORT; }
00053 template <> int PlyType <unsigned char >()  { return ply::T_UCHAR; }
00054 
00059 template <class OpenMeshType>
00060 class ImporterPLY
00061 {
00062 public:
00063 
00064 typedef ::vcg::ply::PropDescriptor PropDescriptor ;
00065 typedef typename OpenMeshType::VertexPointer VertexPointer;
00066 typedef typename OpenMeshType::ScalarType ScalarType;
00067 typedef typename OpenMeshType::VertexType VertexType;
00068 typedef typename OpenMeshType::TetraType TetraType;
00069 typedef typename OpenMeshType::VertexIterator VertexIterator;
00070 typedef typename OpenMeshType::TetraIterator TetraIterator;
00071 
00072 //template <class T> int PlyType () {   assert(0);  return 0;}
00073 
00074 #define MAX_USER_DATA 256
00075 // Struttura ausiliaria per la lettura del file ply
00076 struct LoadPly_TetraAux
00077 {
00078         unsigned char size;
00079         int v[512];
00080         int flags;
00081         float q;
00082         float texcoord[32];
00083         unsigned char ntexcoord;
00084         int texcoordind;
00085         float colors[32];
00086         unsigned char ncolors;
00087         
00088         unsigned char r;
00089         unsigned char g;
00090         unsigned char b;
00091 
00092         unsigned char data[MAX_USER_DATA];  
00093 };
00094 
00095 //struct LoadPly_TristripAux
00096 //{
00097 //      int size;
00098 //      int *v;
00099 //      unsigned char data[MAX_USER_DATA];  
00100 //};
00101 
00102 // Struttura ausiliaria per la lettura del file ply
00103 template<class S>
00104 struct LoadPly_VertAux
00105 {
00106         S p[3];
00107         int flags;
00108         float q;
00109         unsigned char r;
00110         unsigned char g;
00111         unsigned char b;
00112         unsigned char data[MAX_USER_DATA];  
00113 };
00114 
00115 // Struttura ausiliaria caricamento camera
00116 //struct LoadPly_Camera
00117 //{
00118 //      float view_px;
00119 //      float view_py;
00120 //      float view_pz;
00121 //      float x_axisx;
00122 //      float x_axisy;
00123 //      float x_axisz;
00124 //      float y_axisx;
00125 //      float y_axisy;
00126 //      float y_axisz;
00127 //      float z_axisx;
00128 //      float z_axisy;
00129 //      float z_axisz;
00130 //      float focal;
00131 //      float scalex;
00132 //      float scaley;
00133 //      float centerx;
00134 //      float centery;
00135 //      int   viewportx;
00136 //      int   viewporty;
00137 //      float k1;
00138 //      float k2;
00139 //      float k3;
00140 //      float k4;
00141 //};
00142 
00143 static const  PropDescriptor &VertDesc(int i)  
00144 {
00145         const static PropDescriptor pv[9]={
00146                 {"vertex", "x",         ply::T_FLOAT, PlyType<ScalarType>(),offsetof(LoadPly_VertAux<ScalarType>,p[0]),0,0,0,0,0},
00147                 {"vertex", "y",         ply::T_FLOAT, PlyType<ScalarType>(),offsetof(LoadPly_VertAux<ScalarType>,p[1]),0,0,0,0,0},
00148                 {"vertex", "z",         ply::T_FLOAT, PlyType<ScalarType>(),offsetof(LoadPly_VertAux<ScalarType>,p[2]),0,0,0,0,0},
00149                 {"vertex", "flags",     ply::T_INT,   ply::T_INT,           offsetof(LoadPly_VertAux<ScalarType>,flags),0,0,0,0,0},
00150                 {"vertex", "quality",   ply::T_FLOAT, ply::T_FLOAT,         offsetof(LoadPly_VertAux<ScalarType>,q),0,0,0,0,0},
00151                 {"vertex", "red"  ,     ply::T_UCHAR, ply::T_UCHAR,         offsetof(LoadPly_VertAux<ScalarType>,r),0,0,0,0,0},
00152                 {"vertex", "green",     ply::T_UCHAR, ply::T_UCHAR,         offsetof(LoadPly_VertAux<ScalarType>,g),0,0,0,0,0},
00153                 {"vertex", "blue" ,     ply::T_UCHAR, ply::T_UCHAR,         offsetof(LoadPly_VertAux<ScalarType>,b),0,0,0,0,0},
00154                 {"vertex", "confidence",ply::T_FLOAT, ply::T_FLOAT,         offsetof(LoadPly_VertAux<ScalarType>,q),0,0,0,0,0},
00155         };
00156         return pv[i];
00157 }
00158 
00159 
00160 static const  PropDescriptor &TetraDesc(int i)  
00161 {               
00162         const static    PropDescriptor qf[10]=
00163         {
00164                 {"tetra", "vertex_indices", ply::T_INT,   ply::T_INT,   offsetof(LoadPly_TetraAux,v),                1,0,ply::T_UCHAR,ply::T_UCHAR,offsetof(LoadPly_TetraAux,size) },
00165                 {"tetra", "flags",          ply::T_INT,   ply::T_INT,   offsetof(LoadPly_TetraAux,flags),     0,0,0,0,0},
00166                 {"tetra", "quality",        ply::T_FLOAT, ply::T_FLOAT, offsetof(LoadPly_TetraAux,q),         0,0,0,0,0},
00167                 {"tetra", "texcoord",       ply::T_FLOAT, ply::T_FLOAT, offsetof(LoadPly_TetraAux,texcoord),    1,0,ply::T_UCHAR,ply::T_UCHAR,offsetof(LoadPly_TetraAux,ntexcoord) },
00168                 {"tetra", "color",          ply::T_FLOAT, ply::T_FLOAT, offsetof(LoadPly_TetraAux,colors),    1,0,ply::T_UCHAR,ply::T_UCHAR,offsetof(LoadPly_TetraAux,ncolors) },
00169                 {"tetra", "texnumber",      ply::T_INT,   ply::T_INT,   offsetof(LoadPly_TetraAux,texcoordind), 0,0,0,0,0},
00170                 {"tetra", "red"  ,          ply::T_UCHAR, ply::T_UCHAR, offsetof(LoadPly_TetraAux,r),         0,0,0,0,0},
00171                 {"tetra", "green",          ply::T_UCHAR, ply::T_UCHAR, offsetof(LoadPly_TetraAux,g),         0,0,0,0,0},
00172                 {"tetra", "blue" ,          ply::T_UCHAR, ply::T_UCHAR, offsetof(LoadPly_TetraAux,b),         0,0,0,0,0},
00173                 {"tetra", "vertex_index",   ply::T_INT,   ply::T_INT,   offsetof(LoadPly_TetraAux,v),                1,0,ply::T_UCHAR,ply::T_CHAR,offsetof(LoadPly_TetraAux,size) },
00174         };
00175         return qf[i];
00176 }
00177 //static const  PropDescriptor &TristripDesc(int i)  
00178 //{             
00179 //      const static    PropDescriptor qf[1]=
00180 //      {
00181 //              {"tristrips","vertex_indices", ply::T_INT,  ply::T_INT,  offsetof(LoadPly_TristripAux,v),                 1,1,ply::T_INT,ply::T_INT,offsetof(LoadPly_TristripAux,size) },                               
00182 //      };
00183 //      return qf[i];
00184 //}
00185 
00186 
00187 //static const  PropDescriptor &CameraDesc(int i)  
00188 //{             
00189 //      const static PropDescriptor cad[23] =
00190 //      {
00191 //              {"camera","view_px",ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,view_px),0,0,0,0,0},
00192 //              {"camera","view_py",ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,view_py),0,0,0,0,0},
00193 //              {"camera","view_pz",ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,view_pz),0,0,0,0,0},
00194 //              {"camera","x_axisx",ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,x_axisx),0,0,0,0,0},
00195 //              {"camera","x_axisy",ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,x_axisy),0,0,0,0,0},
00196 //              {"camera","x_axisz",ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,x_axisz),0,0,0,0,0},
00197 //              {"camera","y_axisx",ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,y_axisx),0,0,0,0,0},
00198 //              {"camera","y_axisy",ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,y_axisy),0,0,0,0,0},
00199 //              {"camera","y_axisz",ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,y_axisz),0,0,0,0,0},
00200 //              {"camera","z_axisx",ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,z_axisx),0,0,0,0,0},
00201 //              {"camera","z_axisy",ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,z_axisy),0,0,0,0,0},
00202 //              {"camera","z_axisz",ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,z_axisz),0,0,0,0,0},
00203 //              {"camera","focal"  ,ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,focal  ),0,0,0,0,0},
00204 //              {"camera","scalex" ,ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,scalex ),0,0,0,0,0},
00205 //              {"camera","scaley" ,ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,scaley ),0,0,0,0,0},
00206 //              {"camera","centerx",ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,centerx),0,0,0,0,0},
00207 //              {"camera","centery",ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,centery),0,0,0,0,0},
00208 //              {"camera","viewportx",ply::T_INT,ply::T_INT  ,offsetof(LoadPly_Camera,viewportx),0,0,0,0,0},
00209 //              {"camera","viewporty",ply::T_INT,ply::T_INT  ,offsetof(LoadPly_Camera,viewporty),0,0,0,0,0},
00210 //              {"camera","k1"     ,ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,k1 ),0,0,0,0,0},
00211 //              {"camera","k2"     ,ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,k2 ),0,0,0,0,0},
00212 //              {"camera","k3"     ,ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,k3 ),0,0,0,0,0},
00213 //              {"camera","k4"     ,ply::T_FLOAT,ply::T_FLOAT,offsetof(LoadPly_Camera,k4 ),0,0,0,0,0}
00214 //      };
00215 //      return cad[i];
00216 //}
00217 
00218 
00220 static int Open( OpenMeshType &m, const char * filename, CallBackPos *cb=0)
00221 {
00222         PlyInfo pi;
00223   pi.cb=cb; 
00224   return Open(m, filename, pi);
00225 }
00226 
00228 static int Open( OpenMeshType &m, const char * filename, int & loadmask, CallBackPos *cb =0)
00229 {
00230   PlyInfo pi;
00231   pi.mask=loadmask;
00232         return Open(m, filename,pi);
00233   loadmask=pi.mask;
00234 }
00235 
00236 
00238 static int Open( OpenMeshType &m, const char * filename, PlyInfo &pi )
00239 {
00240   assert(filename!=0);
00241         vector<VertexPointer> index;
00242         LoadPly_TetraAux fa;
00243 //      LoadPly_TristripAux tsa;
00244         LoadPly_VertAux<ScalarType> va;
00245   
00246         pi.mask = 0;
00247 
00248         va.flags = 42;
00249 
00250   pi.status = ::vcg::ply::E_NOERROR;
00251 
00252         // The main descriptor of the ply file 
00253         vcg::ply::PlyFile pf;
00254   
00255   // Open the file and parse the header
00256   if( pf.Open(filename,vcg::ply::PlyFile::MODE_READ)==-1 )
00257         {
00258                 pi.status = pf.GetError();
00259                 return -1;
00260         }
00261   pi.header = pf.GetHeader();
00262 
00263         // Descrittori della camera
00264         {  // Check that all the camera properties are present.
00265         /*      bool found = true;
00266                 for(int i=0;i<23;++i)
00267                 {
00268                         if( pf.AddToRead(CameraDesc(i))==-1 ) {
00269                                 found = false;
00270                                 break;
00271                         }
00272                 }
00273                 if(found) pi.mask |= ply::PLYMask::PM_CAMERA;*/
00274         }
00275 
00276   // Descrittori dati standard (vertex coord e faces)
00277   if( pf.AddToRead(VertDesc(0))==-1 ) { pi.status = PlyInfo::E_NO_VERTEX; return -1; }
00278         if( pf.AddToRead(VertDesc(1))==-1 ) { pi.status = PlyInfo::E_NO_VERTEX; return -1; }
00279         if( pf.AddToRead(VertDesc(2))==-1 ) { pi.status = PlyInfo::E_NO_VERTEX; return -1; }
00280         if( pf.AddToRead(TetraDesc(0))==-1 ){ pi.status = PlyInfo::E_NO_VERTEX; return -1; }
00281                 
00282                 
00283 // Se fallisce si prova anche la sintassi di rapidform con index al posto di indices
00284 //              if( pf.AddToRead(TetraDesc(9))==-1 ) 
00285 //                      if(pf.AddToRead(TristripDesc(0))==-1) // Se fallisce tutto si prova a vedere se ci sono tristrip alla levoy.
00286 //                                      { pi.status = PlyInfo::E_NO_FACE;   return -1; }
00287 
00288                 // Descrittori facoltativi dei flags
00289         if( pf.AddToRead(VertDesc(3))!=-1 )
00290                 pi.mask |= ply::PLYMask::PM_VERTFLAGS;
00291 
00292   if( VertexType::HasQuality() )
00293         {
00294                 if( pf.AddToRead(VertDesc(4))!=-1 ||
00295                     pf.AddToRead(VertDesc(8))!=-1 )
00296                         pi.mask |= ply::PLYMask::PM_VERTQUALITY;
00297         }
00298 
00299         if( VertexType::HasColor() )
00300         {
00301                 if( pf.AddToRead(VertDesc(5))!=-1 )
00302                 {
00303                         pf.AddToRead(VertDesc(6));
00304                         pf.AddToRead(VertDesc(7));
00305                         pi.mask |= ply::PLYMask::PM_VERTCOLOR;
00306                 }
00307         }
00308 
00309                         // se ci sono i flag per vertice ci devono essere anche i flag per faccia
00310         if( pf.AddToRead(TetraDesc(1))!=-1 )
00311                 pi.mask |= ply::PLYMask::PM_TETRAFLAGS;
00312 
00313   if( TetraType::HasTetraQuality())
00314         {
00315                 if( pf.AddToRead(TetraDesc(2))!=-1 )
00316                         pi.mask |= ply::PLYMask::PM_TETRAQUALITY;
00317         }
00318 
00319         if( TetraType::HasTetraColor() )
00320         {
00321                 if( pf.AddToRead(TetraDesc(6))!=-1 )
00322                 {
00323                         pf.AddToRead(TetraDesc(7));
00324                         pf.AddToRead(TetraDesc(8));
00325                         pi.mask |= ply::PLYMask::PM_TETRACOLOR;
00326                 }
00327         }
00328 
00329 
00330  // if( FaceType::HasWedgeColor() || FaceType::HasFaceColor() || VertexType::HasColor())
00331         //{
00332         //      if( pf.AddToRead(TetraDesc(4))!=-1 )
00333         //      {
00334         //              pi.mask |= ply::PLYMask::PM_WEDGCOLOR;
00335         //      }
00336         //}
00337 
00338         // Descrittori definiti dall'utente, 
00339         vector<PropDescriptor> VPV(pi.vdn); // property descriptor relative al tipo LoadPly_VertexAux
00340   vector<PropDescriptor> FPV(pi.fdn); // property descriptor relative al tipo LoadPly_FaceAux
00341         if(pi.vdn>0){
00342         // Compute the total size needed to load additional per vertex data.
00343                 size_t totsz=0;
00344                 for(int i=0;i<pi.vdn;i++){
00345                         VPV[i] = pi.VertexData[i];
00346                         VPV[i].offset1=offsetof(LoadPly_VertAux<ScalarType>,data)+totsz;
00347                         totsz+=pi.VertexData[i].memtypesize();
00348                         if( pf.AddToRead(VPV[i])==-1 ) { pi.status = pf.GetError(); return -1; }
00349                 }
00350                 if(totsz > MAX_USER_DATA) 
00351                 { 
00352                         pi.status = vcg::ply::E_BADTYPE; 
00353                         return -1; 
00354                 }
00355         }
00356         if(pi.fdn>0){
00357                 size_t totsz=0;
00358                 for(int i=0;i<pi.fdn;i++){
00359                         FPV[i] = pi.TetraData[i];
00360                         FPV[i].offset1=offsetof(LoadPly_TetraAux,data)+totsz;
00361                         totsz+=pi.TetraData[i].memtypesize();
00362                         if( pf.AddToRead(FPV[i])==-1 ) { pi.status = pf.GetError(); return -1; }
00363                 }
00364                 if(totsz > MAX_USER_DATA) 
00365                 { 
00366       pi.status = vcg::ply::E_BADTYPE; 
00367                         return -1; 
00368                 }
00369         }
00370 
00371   /**************************************************************/
00372   /* Main Reading Loop */
00373   /**************************************************************/
00374   m.Clear();
00375   for(int i=0;i<int(pf.elements.size());i++)
00376         {
00377                 int n = pf.ElemNumber(i);
00378 
00379                 if( !strcmp( pf.ElemName(i),"camera" ) )
00380                 {
00381                         pf.SetCurElement(i);
00382 
00383 //                      LoadPly_Camera ca;
00384 
00385                         for(int j=0;j<n;++j)
00386                         {
00387         /*                      if( pf.Read( (void *)&(ca) )==-1 )
00388                                 {
00389                                         pi.status = PlyInfo::E_SHORTFILE;
00390                                         return -1;
00391                                 }       */
00392                                 //camera.valid     = true;
00393                                 //camera.view_p[0] = ca.view_px;
00394                                 //camera.view_p[1] = ca.view_py;
00395                                 //camera.view_p[2] = ca.view_pz;
00396                                 //camera.x_axis[0] = ca.x_axisx;
00397                                 //camera.x_axis[1] = ca.x_axisy;
00398                                 //camera.x_axis[2] = ca.x_axisz;
00399                                 //camera.y_axis[0] = ca.y_axisx;
00400                                 //camera.y_axis[1] = ca.y_axisy;
00401                                 //camera.y_axis[2] = ca.y_axisz;
00402                                 //camera.z_axis[0] = ca.z_axisx;
00403                                 //camera.z_axis[1] = ca.z_axisy;
00404                                 //camera.z_axis[2] = ca.z_axisz;
00405                                 //camera.f         = ca.focal;
00406                                 //camera.s[0]      = ca.scalex;
00407                                 //camera.s[1]      = ca.scaley;
00408                                 //camera.c[0]      = ca.centerx;
00409                                 //camera.c[1]      = ca.centery;
00410                                 //camera.viewport[0] = ca.viewportx;
00411                                 //camera.viewport[1] = ca.viewporty;
00412                                 //camera.k[0]      = ca.k1;
00413                                 //camera.k[1]      = ca.k2;
00414                                 //camera.k[2]      = ca.k3;
00415                                 //camera.k[3]      = ca.k4;
00416                         }
00417                 }
00418                 else if( !strcmp( pf.ElemName(i),"vertex" ) )
00419                 {
00420                         int j;
00421 
00422                         pf.SetCurElement(i);
00423       VertexIterator vi=Allocator<OpenMeshType>::AddVertices(m,n);
00424                         
00425       for(j=0;j<n;++j)
00426                         {
00427                                 if(pi.cb && (j%1000)==0) pi.cb(j*50/n,"Vertex Loading");
00428                           if( pf.Read( (void *)&(va) )==-1 )
00429                                 {
00430                                         pi.status = PlyInfo::E_SHORTFILE;
00431                                         return -1;
00432                                 }
00433                                 
00434                                 (*vi).P()[0] = va.p[0];
00435                                 (*vi).P()[1] = va.p[1];
00436                                 (*vi).P()[2] = va.p[2];
00437 
00438                                 if( pi.mask & ply::PLYMask::PM_VERTFLAGS )
00439                                         (*vi).Flags() = va.flags;
00440 
00441                                 if( pi.mask & ply::PLYMask::PM_VERTQUALITY )
00442                                         (*vi).Q() = va.q;
00443 
00444                                 if( pi.mask & ply::PLYMask::PM_VERTCOLOR )
00445                                 {
00446                                         (*vi).C()[0] = va.r;
00447                                         (*vi).C()[1] = va.g;
00448                                         (*vi).C()[2] = va.b;
00449                                         (*vi).C()[3] = 255;
00450                                 }
00451 
00452                                 
00453                                 for(int k=0;k<pi.vdn;k++)       
00454                                         memcpy((char *)(&*vi) + pi.VertexData[k].offset1,
00455                                                                         (char *)(&va) + VPV[k].offset1, 
00456                                                                         VPV[k].memtypesize());
00457                         ++vi;
00458       }
00459 
00460                         index.resize(n);
00461                         for(j=0,vi=m.vert.begin();j<n;++j,++vi)
00462                                 index[j] = &*vi;
00463                 }
00464                 else if( !strcmp( pf.ElemName(i),"tetra") )/************************************************************/
00465                 {
00466                         int j;
00467                         int k;
00468       TetraIterator fi=Allocator<OpenMeshType>::AddTetra(m,n);
00469                         pf.SetCurElement(i);
00470 
00471                         for(j=0;j<n;++j)
00472                         {
00473                                 
00474 
00475                                 if(pi.cb && (j%1000)==0) pi.cb(50+j*50/n,"Tetra Loading");
00476                                 if( pf.Read(&fa)==-1 )
00477                                 {
00478                                         pi.status = PlyInfo::E_SHORTFILE;
00479                                         return -1;
00480                                 }
00481                                 if(fa.size!=4)
00482                                 {
00483                                         pi.status = PlyInfo::E_NO_3VERTINFACE;
00484                                         return -1;
00485                                 }
00486 
00487                                 for(k=0;k<4;++k)
00488                                 {
00489                                         if( fa.v[k]<0 || fa.v[k]>=m.vn )
00490                                         {
00491                                                 pi.status = PlyInfo::E_BAD_VERT_INDEX;
00492                                                 return -1;
00493                                         }
00494                                         (*fi).V(k) = index[ fa.v[k] ];
00495                                 }
00496 
00497                                 if( pi.mask & ply::PLYMask::PM_TETRAFLAGS )
00498                                 {
00499                                         (*fi).Flags() = fa.flags;
00500                                 }
00501 
00502                                 if( pi.mask & ply::PLYMask::PM_TETRAQUALITY )
00503                                 {
00504                                         (*fi).Q() = fa.q;
00505                                 }
00506 
00507                                 if( pi.mask & ply::PLYMask::PM_TETRACOLOR )
00508                                 {
00509                                         (*fi).C()[0] = fa.r;
00510                                         (*fi).C()[1] = fa.g;
00511                                         (*fi).C()[2] = fa.b;
00512                                         (*fi).C()[3] = 255;
00513                                 }
00514 
00515                                         if(TetraType::HasTetraColor()){
00516                                                 {
00517                                                         (*fi).C()[0] = (unsigned char)((fa.colors[0*3+0]*255+fa.colors[1*3+0]*255+fa.colors[2*3+0]*255)/3.0f);
00518                                                         (*fi).C()[1] = (unsigned char)((fa.colors[0*3+1]*255+fa.colors[1*3+1]*255+fa.colors[2*3+1]*255)/3.0f);
00519                                                         (*fi).C()[2] = (unsigned char)((fa.colors[0*3+2]*255+fa.colors[1*3+2]*255+fa.colors[2*3+2]*255)/3.0f);
00520                                                 }
00521                                         }
00522                                 }
00523 
00524                                 for(k=0;k<pi.fdn;k++)   
00525                                         memcpy((char *)(&(*fi)) + pi.TetraData[k].offset1,
00526                                                                  (char *)(&fa) + FPV[k].offset1, 
00527                                                                         FPV[k].memtypesize());
00528       ++fi;
00529       }
00530 //              }
00531 //else if( !strcmp( pf.ElemName(i),"tristrips") )//////////////////// LETTURA TRISTRIP DI STANFORD
00532 //              {
00533 //                      int j;
00534 //                      pf.SetCurElement(i);
00535 //                      int numvert_tmp = m.vert.size();
00536 //                      for(j=0;j<n;++j)
00537 //                      {
00538 //                              int k;
00539 //                              if(pi.cb && (j%1000)==0) pi.cb(50+j*50/n,"Tristrip Face Loading");
00540 //                              if( pf.Read(&tsa)==-1 )
00541 //                              {
00542 //                                      pi.status = PlyInfo::E_SHORTFILE;
00543 //                                      return -1;
00544 //                              }
00545 //                              int remainder=0;
00546 //                              //int startface=m.face.size();
00547 //                              for(k=0;k<tsa.size-2;++k)
00548 //                              {
00549 //                                      if(pi.cb && (k%1000)==0) pi.cb(50+k*50/tsa.size,"Tristrip Face Loading");                               
00550 //          if(tsa.v[k]<0 || tsa.v[k]>=numvert_tmp )    {
00551 //                                              pi.status = PlyInfo::E_BAD_VERT_INDEX;
00552 //                                              return -1;
00553 //                                      }
00554 //                                if(tsa.v[k+2]==-1)
00555 //                                      {
00556 //                                              k+=2;
00557 //                                              if(k%2) remainder=0;
00558 //                                                       else remainder=1;
00559 //                                              continue;
00560 //                                      }
00561 //                                      tf.V(0) = index[ tsa.v[k+0] ];
00562 //                                      tf.V(1) = index[ tsa.v[k+1] ];
00563 //                                      tf.V(2) = index[ tsa.v[k+2] ];
00564 //                                      if((k+remainder)%2) swap (tf.V(0), tf.V(1) );
00565 //                                      m.face.push_back( tf );
00566 //                              }
00567 //                      }
00568 //              }
00569                 else
00570                 {
00571                                 // Skippaggio elementi non gestiti
00572                         int n = pf.ElemNumber(i);
00573                         pf.SetCurElement(i);
00574 
00575                         for(int j=0;j<n;j++)
00576                         {
00577                                 if( pf.Read(0)==-1)
00578                                 {
00579                                         pi.status = PlyInfo::E_SHORTFILE;
00580                                         return -1;
00581                                 }
00582                         }
00583                 }
00584         }
00585 
00586  // // Parsing texture names
00587         //textures.clear();
00588         //normalmaps.clear();
00589 
00590         //for(int co=0;co<int(pf.comments.size());++co)
00591         //{
00592         //      const char * TFILE = "TextureFile";
00593         //      const char * NFILE = "TextureNormalFile";
00594         //      const char * c = pf.comments[co];
00595         //      char buf[256];
00596         //      int i,j,n;
00597 
00598         //      if( !strncmp(c,TFILE,strlen(TFILE)) )
00599         //      {
00600         //              strcpy(buf,c+strlen(TFILE)+1);
00601         //              n = strlen(buf);
00602         //              for(i=j=0;i<n;i++)
00603         //                      if( buf[i]!=' ' && buf[i]!='\t' && buf[i]>32 && buf[i]<125 )    buf[j++] = buf[i];
00604         //              
00605         //              buf[j] = 0;
00606         //              char buf2[255];
00607         //              __interpret_texture_name( buf,filename,buf2 );
00608         //              textures.push_back( xstring(buf2) );
00609         //      }
00610         //      if( !strncmp(c,NFILE,strlen(NFILE)) )
00611         //      {
00612         //              strcpy(buf,c+strlen(NFILE)+1);
00613         //              n = strlen(buf);
00614         //              for(i=j=0;i<n;i++)
00615         //                      if( buf[i]!=' ' && buf[i]!='\t' && buf[i]>32 && buf[i]<125 )    buf[j++] = buf[i];
00616         //              
00617         //              buf[j] = 0;
00618         //              char buf2[255];
00619         //              __interpret_texture_name( buf,filename,buf2 );
00620         //              normalmaps.push_back( xstring(buf2) );
00621         //      }
00622         //}
00623 
00624   // vn and fn should be correct but if someone wrongly saved some deleted elements they can be wrong.
00625         m.vn = 0;
00626         VertexIterator vi;
00627         for(vi=m.vert.begin();vi!=m.vert.end();++vi)
00628                 if( ! (*vi).IsD() )
00629                         ++m.vn;
00630 
00631         m.tn = 0;
00632         TetraIterator fi;
00633         for(fi=m.tetra.begin();fi!=m.tetra.end();++fi)
00634                 if( ! (*fi).IsD() )
00635                         ++m.tn;
00636 
00637         return 0;
00638 }
00639 
00640 
00641         // Caricamento camera da un ply
00642 int LoadCamera(const char * filename)
00643 {
00644         vcg::ply::PlyFile pf;
00645         if( pf.Open(filename,vcg::ply::PlyFile::MODE_READ)==-1 )
00646         {
00647                 pi.status = pf.GetError();
00648                 return -1;
00649         }
00650 
00651 
00652         bool found = true;
00653         int i;
00654         for(i=0;i<23;++i)
00655         {
00656                 if( pf.AddToRead(CameraDesc(i))==-1 )
00657                 {
00658                         found = false;
00659                         break;
00660                 }
00661         }
00662 
00663         if(!found)
00664                 return -1;
00665 
00666         for(i=0;i<int(pf.elements.size());i++)
00667         {
00668                 int n = pf.ElemNumber(i);
00669 
00670                 if( !strcmp( pf.ElemName(i),"camera" ) )
00671                 {
00672                         pf.SetCurElement(i);
00673 
00674                         //LoadPly_Camera ca;
00675 
00676                         for(int j=0;j<n;++j)
00677                         {
00678                                 if( pf.Read( (void *)&(ca) )==-1 )
00679                                 {
00680                                         pi.status = PlyInfo::E_SHORTFILE;
00681                                         return -1;
00682                                 }       
00683                                 camera.valid     = true;
00684                                 camera.view_p[0] = ca.view_px;
00685                                 camera.view_p[1] = ca.view_py;
00686                                 camera.view_p[2] = ca.view_pz;
00687                                 camera.x_axis[0] = ca.x_axisx;
00688                                 camera.x_axis[1] = ca.x_axisy;
00689                                 camera.x_axis[2] = ca.x_axisz;
00690                                 camera.y_axis[0] = ca.y_axisx;
00691                                 camera.y_axis[1] = ca.y_axisy;
00692                                 camera.y_axis[2] = ca.y_axisz;
00693                                 camera.z_axis[0] = ca.z_axisx;
00694                                 camera.z_axis[1] = ca.z_axisy;
00695                                 camera.z_axis[2] = ca.z_axisz;
00696                                 camera.f         = ca.focal;
00697                                 camera.s[0]      = ca.scalex;
00698                                 camera.s[1]      = ca.scaley;
00699                                 camera.c[0]      = ca.centerx;
00700                                 camera.c[1]      = ca.centery;
00701                                 camera.viewport[0] = ca.viewportx;
00702                                 camera.viewport[1] = ca.viewporty;
00703                                 camera.k[0]      = ca.k1;
00704                                 camera.k[1]      = ca.k2;
00705                                 camera.k[2]      = ca.k3;
00706                                 camera.k[3]      = ca.k4;
00707                         }
00708                         break;
00709                 }
00710         }
00711 
00712         return 0;
00713 }
00714 
00715 
00716 bool LoadMask(const char * filename, int &mask)
00717 {
00718         mask=0;
00719         vcg::ply::PlyFile pf;
00720         if( pf.Open(filename,vcg::ply::PlyFile::MODE_READ)==-1 )
00721         {
00722                 pi.status = pf.GetError();
00723                 return false;
00724         }
00725 
00726         if( pf.AddToRead(VertDesc(0))!=-1 && 
00727             pf.AddToRead(VertDesc(1))!=-1 && 
00728             pf.AddToRead(VertDesc(2))!=-1 )   mask |= ply::PLYMask::PM_VERTCOORD;
00729 
00730         if( pf.AddToRead(VertDesc(3))!=-1 )             mask |= ply::PLYMask::PM_VERTFLAGS;
00731         if( pf.AddToRead(VertDesc(4))!=-1 )             mask |= ply::PLYMask::PM_VERTQUALITY;
00732         if( pf.AddToRead(VertDesc(8))!=-1 )             mask |= ply::PLYMask::PM_VERTQUALITY;
00733         if( ( pf.AddToRead(VertDesc(5))!=-1 ) && 
00734                   ( pf.AddToRead(VertDesc(6))!=-1 ) &&
00735                         ( pf.AddToRead(VertDesc(7))!=-1 )  )  mask |= ply::PLYMask::PM_VERTCOLOR;
00736         
00737         if( pf.AddToRead(TetraDesc(0))!=-1 ) mask |= ply::PLYMask::PM_TETRAINDEX;
00738         if( pf.AddToRead(TetraDesc(1))!=-1 ) mask |= ply::PLYMask::PM_TETRAFLAGS;
00739 
00740         if( pf.AddToRead(TetraDesc(2))!=-1 ) mask |= ply::PLYMask::PM_TETRAQUALITY;
00741         //if( pf.AddToRead(TetraDesc(3))!=-1 ) mask |= ply::PLYMask::PM_WEDGTEXCOORD;
00742         //if( pf.AddToRead(TetraDesc(5))!=-1 ) mask |= ply::PLYMask::PM_WEDGTEXMULTI;
00743         if( pf.AddToRead(TetraDesc(4))!=-1 ) mask |= ply::PLYMask::PM_WEDGCOLOR;
00744         if( ( pf.AddToRead(TetraDesc(6))!=-1 ) && 
00745                   ( pf.AddToRead(TetraDesc(7))!=-1 ) &&
00746                         ( pf.AddToRead(TetraDesc(8))!=-1 )  )  mask |= ply::PLYMask::PM_TETRACOLOR;
00747 
00748 
00749  return true;
00750 }
00751 
00752 
00753 }; // end class
00754 
00755 
00756 
00757 } // end namespace tri
00758 } // end namespace io
00759 } // end namespace vcg
00760 
00761 #endif


shape_reconstruction
Author(s): Roberto Martín-Martín
autogenerated on Sat Jun 8 2019 18:31:57