00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 #ifndef __VCG_PLYLIB
00053 #define __VCG_PLYLIB
00054
00055 #include <memory.h>
00056 #include <vector>
00057 #include <string>
00058 #include <assert.h>
00059
00060 namespace vcg {
00061 namespace ply {
00062
00063
00064 enum PlyTypes {
00065 T_NOTYPE,
00066 T_CHAR,
00067 T_SHORT,
00068 T_INT,
00069 T_UCHAR,
00070 T_USHORT,
00071 T_UINT,
00072 T_FLOAT,
00073 T_DOUBLE,
00074 T_MAXTYPE
00075 };
00076
00077
00078 enum PlyError {
00079 E_NOERROR,
00080
00081 E_CANTOPEN,
00082 E_NOTHEADER,
00083 E_UNESPECTEDEOF,
00084 E_NOFORMAT,
00085 E_SYNTAX,
00086 E_PROPOUTOFELEMENT,
00087 E_BADTYPENAME,
00088
00089 E_ELEMNOTFOUND,
00090 E_PROPNOTFOUND,
00091 E_BADTYPE,
00092 E_INCOMPATIBLETYPE,
00093 E_BADCAST,
00094 E_MAXPLYERRORS
00095 };
00096
00097
00098 enum PlyFormat {
00099 F_UNSPECIFIED,
00100 F_ASCII,
00101 F_BINLITTLE,
00102 F_BINBIG
00103 };
00104
00105
00106 #ifdef USE_ZLIB
00107 typedef void * GZFILE;
00108 #else
00109 typedef FILE * GZFILE;
00110 #endif
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120 class PropDescriptor
00121 {
00122 public:
00123 const char * elemname;
00124 const char * propname;
00125 int stotype1;
00126 int memtype1;
00127 size_t offset1;
00128 int islist;
00129 int alloclist;
00130 int stotype2;
00131 int memtype2;
00132 size_t offset2;
00133
00134 int format;
00135
00136 size_t stotypesize() const;
00137 size_t memtypesize() const;
00138 const char *memtypename() const;
00139 const char *stotypename() const;
00140 };
00141
00142
00143 typedef bool (* readelemcb) ( GZFILE fp, void * mem, PropDescriptor * p );
00144
00145 class PlyProperty
00146 {
00147 public:
00148 inline PlyProperty()
00149 {
00150 tipo = 0;
00151 islist = 0;
00152 tipoindex = 0;
00153 bestored = 0;
00154 }
00155
00156 inline PlyProperty( const char * na, int ti, int isl, int t2 )
00157 {
00158 assert(na);
00159 assert(ti>0);
00160 assert(ti<T_MAXTYPE);
00161 assert( t2>0 || (t2==0 && isl==0) );
00162 assert(t2<T_MAXTYPE);
00163
00164 name = std::string(na);
00165 tipo = ti;
00166 islist = isl;
00167 tipoindex = t2;
00168 bestored = 0;
00169 }
00170
00171 std::string name;
00172 int tipo;
00173 int islist;
00174 int tipoindex;
00175
00176 int bestored;
00177 PropDescriptor desc;
00178
00179 readelemcb cb;
00180 };
00181
00182
00183 class PlyElement
00184 {
00185 public:
00186
00187 inline PlyElement()
00188 {
00189 number = 0;
00190 }
00191
00192 inline PlyElement( const char * na, int nu )
00193 {
00194 assert(na);
00195 assert(nu>=0);
00196
00197 name = std::string(na);
00198 number = nu;
00199 }
00200
00201
00202 inline void SetName( const char * na )
00203 {
00204 name = std::string(na);
00205 }
00206
00207 inline void SetNumbert( int nu )
00208 {
00209 assert(nu>0);
00210 number = nu;
00211 }
00212
00213 void AddProp( const char * na, int ti, int isl, int t2 );
00214
00215 int AddToRead(
00216 const char * propname,
00217 int stotype1,
00218 int memtype1,
00219 size_t offset1,
00220 int islist,
00221 int alloclist,
00222 int stotype2,
00223 int memtype2,
00224 size_t offset2
00225 );
00226
00227 PlyProperty * FindProp( const char * name );
00228
00229 std::string name;
00230 int number;
00231
00232 std::vector<PlyProperty> props;
00233 };
00234
00235
00236 class PlyFile
00237 {
00238 private:
00239 void compile( PlyElement * e );
00240 void compile( PlyProperty * p );
00241
00242 public:
00243
00244 enum {
00245 MODE_READ,
00246 MODE_WRITE
00247 };
00248
00249 PlyFile();
00250 ~PlyFile();
00251
00252
00253 int Open( const char * filename, int mode );
00254
00255 void Destroy();
00256
00257 inline int GetError() const { return error; }
00258
00259 int AddToRead(
00260 const char * elemname,
00261 const char * propname,
00262 int stotype1,
00263 int memtype1,
00264 size_t offset1,
00265 int islist,
00266 int alloclist,
00267 int stotype2,
00268 int memtype2,
00269 size_t offset2
00270 );
00271
00272 inline int AddToRead( const PropDescriptor & p )
00273 {
00274 return AddToRead(p.elemname,p.propname,p.stotype1,
00275 p.memtype1,p.offset1,p.islist,p.alloclist,p.stotype2,
00276 p.memtype2,p.offset2
00277 );
00278 }
00279
00280
00281 const char * ElemName( int i );
00282
00283 int ElemNumber( int i ) const;
00284
00285
00286 inline void SetCurElement( int i )
00287 {
00288 if(i<0 || i>=int(elements.size())) cure = 0;
00289 else
00290 {
00291 cure = &(elements[i]);
00292 compile(cure);
00293 }
00294 }
00295
00296 int Read( void * mem );
00297
00298 std::vector<PlyElement> elements;
00299 std::vector<std::string> comments;
00300 static const char * typenames[9];
00301 static const char * newtypenames[9];
00302
00303 inline const char * GetHeader() const { return header; }
00304 protected:
00305
00306 GZFILE gzfp;
00307
00308 float version;
00309 int error;
00310 int format;
00311
00312 char header[4096];
00313
00314 PlyElement * cure;
00315
00316
00317 int (* ReadCB)( GZFILE fp, const PlyProperty * r, void * mem, int fmt );
00318
00319 int OpenRead( const char * filename );
00320 int OpenWrite( const char * filename );
00321
00322 PlyElement * AddElement( const char * name, int number );
00323 int FindType( const char * name ) const;
00324 PlyElement * FindElement( const char * name );
00325 };
00326
00327 void interpret_texture_name(const char*a, const char*fn, char*output);
00328
00329 }
00330 }
00331 #endif