Added copy of the nanoply library

This commit is contained in:
Paolo Cignoni 2015-09-10 21:16:44 +00:00
parent c27a19e3d1
commit 175266d7dc
3 changed files with 313 additions and 0 deletions

View File

@ -0,0 +1,281 @@
#ifndef NANOPLY_HPP
#define NANOPLY_HPP
#include <vector>
#include <tuple>
#include <cassert>
#include <algorithm>
#include <stdexcept>
#include <cstdio> // for fwrite()
#include <cmath> // for fabs(),...
#include <limits>
// Avoid conflicting declaration of min/max macros in windows headers
#if !defined(NOMINMAX) && (defined(_WIN32) || defined(_WIN32_) || defined(WIN32) || defined(_WIN64))
# define NOMINMAX
# ifdef max
# undef max
# undef min
# endif
#endif
namespace nanoply
{
typedef enum NNP_ERROR {
NNP_OK = 0x0000,
NNP_UNABLE_TO_OPEN = 0x0001,
NNP_MISSING_HEADER = 0x0002,
NNP_MISSING_FORMAT = 0x0004
} ErrorCode;
typedef enum NNP_ENTITY {
NNP_UNKNOWN_ENTITY = 0x0000,
NNP_PX = 0x0001,
NNP_PY = 0x0002,
NNP_PZ = 0x0004,
NNP_PXYZ = 0x0007,
NNP_NX = 0x0010,
NNP_NY = 0x0020,
NNP_NZ = 0x0040,
NNP_NXYZ = 0x0070,
NNP_CR = 0x0100,
NNP_CG = 0x0200,
NNP_CB = 0x0400,
NNP_CA = 0x0800,
NNP_RADIUS = 0x1000,
NNP_SCALE = 0x2000
} PlyEntity;
typedef enum NNP_PLYTYPE {
NNP_UNKNOWN_TYPE= 0x0000,
NNP_FLOAT32 = 0x0001,
NNP_FLOAT64 = 0x0002,
NNP_INT8 = 0x0010,
NNP_INT16 = 0x0020,
NNP_INT32 = 0x0040,
NNP_UINT8 = 0x0100,
NNP_UINT16 = 0x0200,
NNP_UINT32 = 0x0400,
NNP_LIST_UINT8_UINT32 = 0x1000,
NNP_LIST_INT8_UINT32 = 0x2000,
NNP_LIST_UINT8_INT32 = 0x4000,
NNP_LIST_INT8_INT32 = 0x8000
} PlyType;
class PlyProperty
{
public:
PlyProperty(PlyType _t, PlyEntity _e):type(_t),elem(_e){}
PlyType type;
PlyEntity elem;
};
// In Ply an element is a collection of properties.
//
class PlyElement
{
public:
std::string name;
int cnt;
std::vector<PlyProperty> propVec;
bool AddProperty(const char *line);
bool InitFromHeader(FILE *fp, char *line);
};
//
bool PlyElement::InitFromHeader(FILE *fp, char *line)
{
char buf[128];
for(int i=0;line[i]!=0;++i) buf[i]=tolower(line[i]);
strtok(buf," \t"); // property
assert(strstr(buf,"element"));
char *el = strtok(0," \t\n"); // float
name = std::string(el);
sscanf(line,"%*s %*s %i",&cnt);
printf("Adding Element '%s' (%i) \n",name.c_str(),cnt);
fgets(line,4096,fp);
while(strstr(line,"property"))
{
AddProperty(line);
fgets(line,4096,fp);
}
}
// Skip all the elements in a file
bool PlyElement::SkipAsciiElementsInFile(FILE *fp)
{
char line[4096];
for(int i=0;i<this->cnt;++i)
fgets(line,4096,fp);
}
// Skip all the elements in a file
bool PlyElement::SkipBinaryElementsInFile(FILE *fp)
{
for(int i=0;i<this->cnt;++i)
{
for(j=0;j<this->propVec.size();++j)
{
}
}
}
bool PlyElement::AddProperty(const char *line)
{
char buf[128];
for(int i=0;line[i]!=0;++i) buf[i]=tolower(line[i]);
strtok(buf," \t"); // property
char *ty = strtok(0," \t\n"); // float
PlyType type = NNP_UNKNOWN_TYPE;
PlyEntity prop = NNP_UNKNOWN_ENTITY;
if(strstr(ty,"float") || strstr(ty,"float32") ) type = NNP_FLOAT32;
if(strstr(ty,"double") || strstr(ty,"float64") ) type = NNP_FLOAT64;
if(strstr(ty,"char") || strstr(ty,"int8") ) type = NNP_INT8;
if(strstr(ty,"short") || strstr(ty,"int16") ) type = NNP_INT16;
if(strstr(ty,"int") || strstr(ty,"int32") ) type = NNP_INT32;
if(strstr(ty,"uchar") || strstr(ty,"uint8") ) type = NNP_UINT8;
if(strstr(ty,"ushort") || strstr(ty,"uint16") ) type = NNP_UINT16;
if(strstr(ty,"uint") || strstr(ty,"uint32") ) type = NNP_UINT32;
if(strstr(ty,"list") ) {
char *ty1 = strtok(0," \t\n");
char *ty2 = strtok(0," \t\n");
if( (strstr(ty1,"uchar")||strstr(ty1,"uint8") ) && (strstr(ty2,"uint")|| strstr(ty2,"uint32")) ) type = NNP_LIST_UINT8_UINT32;
if( (strstr(ty1,"char") || strstr(ty1,"int8") ) && (strstr(ty2,"uint")|| strstr(ty2,"uint32")) ) type = NNP_LIST_INT8_UINT32;
if( (strstr(ty1,"uchar")||strstr(ty1,"uint8") ) && (strstr(ty2,"int") || strstr(ty2,"int32")) ) type = NNP_LIST_UINT8_INT32;
if( (strstr(ty1,"char") || strstr(ty1,"int8") ) && (strstr(ty2,"int") || strstr(ty2,"int32")) ) type = NNP_LIST_INT8_INT32;
}
assert(type != NNP_UNKNOWN_TYPE);
char *el = strtok(0," \t\n"); // x
if(strstr(el,"x")) prop = NNP_PX;
if(strstr(el,"y")) prop = NNP_PY;
if(strstr(el,"z")) prop = NNP_PZ;
if(strstr(el,"nx")) prop = NNP_NX;
if(strstr(el,"ny")) prop = NNP_NY;
if(strstr(el,"nz")) prop = NNP_NZ;
// assert(prop != NNP_UNKNOWN_PROP);
propVec.push_back(PlyProperty(type,prop));
printf("Adding Property %i %i\n",type,prop);
}
class Info
{
public:
ErrorCode errInfo;
bool binary;
int mask;
int vertexNum;
std::vector<PlyElement> elemVec;
void Clear() { errInfo=NNP_OK; }
};
inline bool GetInfo(const char *filename, nanoply::Info &info)
{
FILE *fp=fopen(filename,"r");
info.Clear();
if(!fp)
{
info.errInfo = NNP_UNABLE_TO_OPEN;
return false;
}
char buf[4096];
fgets(buf,4096,fp);
if( (strncmp(buf,"PLY",3)!=0) && (strncmp(buf,"ply",3)!=0) )
{
info.errInfo = NNP_MISSING_HEADER;
return false;
}
fgets(buf,4096,fp);
if(strncmp(buf,"format",strlen("format"))!=0)
{
info.errInfo = NNP_MISSING_FORMAT;
return false;
}
if(strstr(buf,"ascii") || strstr(buf,"ASCII"))
info.binary=false;
else
{
if(strstr(buf,"binary") || strstr(buf,"BINARY"))
info.binary=true;
else
{
info.errInfo = NNP_MISSING_FORMAT;
return false;
}
}
fgets(buf,4096,fp);
while(strncmp(buf,"end_header",strlen("end_header")))
{
if(strstr(buf,"comment") || strstr(buf,"COMMENT") )
{
fgets(buf,4096,fp);
continue;
}
if(strstr(buf,"element"))
{
PlyElement pe;
pe.InitFromHeader(fp,buf);
info.elemVec.push_back(pe);
}
}
}
template<class DestinationType>
class DataDescriptor
{
DestinationType *base;
int curPos;
PlyProperty elem;
public:
DataDescriptor(PlyProperty _e, DestinationType *_b):elem(_e),base(_b),curPos(0)
{
}
DataDescriptor(PlyProperty _e, void *_b ):elem(_e),base((DestinationType *)_b),curPos(0)
{
}
void Restart(){curPos=0;}
void ReadElem(FILE *fp, int numOfElemToRead)
{
fread(base+curPos,sizeof(DestinationType),numOfElemToRead,fp);
}
};
template <class DataAdaptorTuple>
bool Open(const char *filename, DataAdaptorTuple vertexAdaptor, nanoply::Info &info)
{
FILE *fp=fopen(filename,"rb");
if(!fp)
{
return false;
}
char buf[4096];
do
{
fgets(buf,4096,fp);
}
while(strncmp(buf,"end_header",strlen("end_header")) );
// Now start the real reading!
for(int i =0; i< info.elemVec.size();++i)
{
}
}
} // end namespace nanoply
#endif // NANOPLY_HPP

View File

@ -0,0 +1,24 @@
#include <iostream>
#include <nanoply.hpp>
using namespace std;
using namespace nanoply;
struct Point3f
{
float x,y,z;
};
int main()
{
std::vector<Point3f> coordVec;
std::vector<Point3f> normalVec;
nanoply::Info info;
nanoply::GetInfo("sphere13k.ply",info);
// Open("pippo.ply",std::make_tuple(DataDescriptor<std::tuple<float,float,float> >(NNP_PXYZ,&*coordVec.begin()),
// DataDescriptor<std::tuple<float,float,float> >(NNP_NXYZ,&*normalVec.begin())),
// info );
return 0;
}

View File

@ -0,0 +1,8 @@
DEPENDPATH += ..
INCLUDEPATH += ..
CONFIG += console stl c++11
CONFIG -= qt
TEMPLATE = app
# Mac specific Config required to avoid to make application bundles
CONFIG -= app_bundle
SOURCES += main.cpp