Added copy of the nanoply library
This commit is contained in:
parent
c27a19e3d1
commit
175266d7dc
|
@ -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
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue