Added support for point clouds to openctm. Using an hack becouse openctm officially do not want it...
This commit is contained in:
parent
f4a0b8bce4
commit
bf01793bd8
|
@ -44,7 +44,7 @@ namespace vcg {
|
||||||
std::vector<CTMfloat> aColors(aVertCount*4);
|
std::vector<CTMfloat> aColors(aVertCount*4);
|
||||||
std::vector<CTMfloat> aQuality(aVertCount*4);
|
std::vector<CTMfloat> aQuality(aVertCount*4);
|
||||||
std::vector<CTMuint> aIndices(aTriCount*3);
|
std::vector<CTMuint> aIndices(aTriCount*3);
|
||||||
|
int err;
|
||||||
CTMcontext context;
|
CTMcontext context;
|
||||||
// Create a new exporter context
|
// Create a new exporter context
|
||||||
context = ctmNewContext(CTM_EXPORT);
|
context = ctmNewContext(CTM_EXPORT);
|
||||||
|
@ -54,26 +54,32 @@ namespace vcg {
|
||||||
ctmVertexPrecision(context, relativePrecision);
|
ctmVertexPrecision(context, relativePrecision);
|
||||||
}
|
}
|
||||||
// Prepare vertex and faces
|
// Prepare vertex and faces
|
||||||
for(int i=0;i<aVertCount;++i)
|
for(unsigned int i=0;i<aVertCount;++i)
|
||||||
{
|
{
|
||||||
aVertices[i*3+0]=m.vert[i].P()[0];
|
aVertices[i*3+0]=m.vert[i].P()[0];
|
||||||
aVertices[i*3+1]=m.vert[i].P()[1];
|
aVertices[i*3+1]=m.vert[i].P()[1];
|
||||||
aVertices[i*3+2]=m.vert[i].P()[2];
|
aVertices[i*3+2]=m.vert[i].P()[2];
|
||||||
}
|
}
|
||||||
for(int i=0;i<aTriCount;++i)
|
for(unsigned int i=0;i<aTriCount;++i)
|
||||||
{
|
{
|
||||||
aIndices[i*3+0]=m.face[i].V(0)-&*m.vert.begin();
|
aIndices[i*3+0]=m.face[i].V(0)-&*m.vert.begin();
|
||||||
aIndices[i*3+1]=m.face[i].V(1)-&*m.vert.begin();
|
aIndices[i*3+1]=m.face[i].V(1)-&*m.vert.begin();
|
||||||
aIndices[i*3+2]=m.face[i].V(2)-&*m.vert.begin();
|
aIndices[i*3+2]=m.face[i].V(2)-&*m.vert.begin();
|
||||||
}
|
}
|
||||||
|
if(aTriCount==0)
|
||||||
|
{
|
||||||
|
aIndices.resize(3,0);
|
||||||
|
aTriCount=1;
|
||||||
|
}
|
||||||
|
|
||||||
// Define our mesh representation to OpenCTM
|
// Define our mesh representation to OpenCTM
|
||||||
ctmDefineMesh(context, &*aVertices.begin(), aVertCount, &*aIndices.begin(), aTriCount, NULL);
|
ctmDefineMesh(context, &*aVertices.begin(), aVertCount, &*aIndices.begin(), aTriCount, NULL);
|
||||||
|
err=ctmGetError(context);
|
||||||
|
if(err) return err;
|
||||||
if( tri::HasPerVertexColor(m) && (mask & io::Mask::IOM_VERTCOLOR))
|
if( tri::HasPerVertexColor(m) && (mask & io::Mask::IOM_VERTCOLOR))
|
||||||
{
|
{
|
||||||
aColors.resize(aVertCount*4);
|
aColors.resize(aVertCount*4);
|
||||||
for(int i=0;i<aVertCount;++i)
|
for(unsigned int i=0;i<aVertCount;++i)
|
||||||
{
|
{
|
||||||
aColors[i*4+0]=(float)(m.vert[i].C()[0])/255.0f;
|
aColors[i*4+0]=(float)(m.vert[i].C()[0])/255.0f;
|
||||||
aColors[i*4+1]=(float)(m.vert[i].C()[1])/255.0f;
|
aColors[i*4+1]=(float)(m.vert[i].C()[1])/255.0f;
|
||||||
|
@ -85,7 +91,7 @@ namespace vcg {
|
||||||
if( tri::HasPerVertexQuality(m) && (mask & io::Mask::IOM_VERTQUALITY))
|
if( tri::HasPerVertexQuality(m) && (mask & io::Mask::IOM_VERTQUALITY))
|
||||||
{
|
{
|
||||||
aQuality.resize(aVertCount*4,0);
|
aQuality.resize(aVertCount*4,0);
|
||||||
for(int i=0;i<aVertCount;++i)
|
for(unsigned int i=0;i<aVertCount;++i)
|
||||||
{
|
{
|
||||||
aQuality[i*4+0]=m.vert[i].Q();
|
aQuality[i*4+0]=m.vert[i].Q();
|
||||||
}
|
}
|
||||||
|
@ -94,9 +100,11 @@ namespace vcg {
|
||||||
|
|
||||||
// Save the OpenCTM file
|
// Save the OpenCTM file
|
||||||
ctmSave(context, filename);
|
ctmSave(context, filename);
|
||||||
|
err=ctmGetError(context);
|
||||||
|
if(err) return err;
|
||||||
// Free the context
|
// Free the context
|
||||||
ctmFreeContext(context);
|
ctmFreeContext(context);
|
||||||
return 0;
|
return err;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
returns mask of capability one define with what are the saveable information of the format.
|
returns mask of capability one define with what are the saveable information of the format.
|
||||||
|
@ -114,8 +122,8 @@ namespace vcg {
|
||||||
|
|
||||||
static const char *ErrorMsg(int error)
|
static const char *ErrorMsg(int error)
|
||||||
{
|
{
|
||||||
if(error==-1) return "unable to open file";
|
if(error==0) return "Ok, no errors";
|
||||||
return "Ok, no errors";
|
else return ctmErrorString((CTMenum)error);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
} // end namespace io
|
} // end namespace io
|
||||||
|
|
|
@ -86,7 +86,7 @@ static const char* ErrorMsg(int error)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static int Open( OpenMeshType &m, const char * filename, int &loadmask, CallBackPos *cb=0)
|
static int Open( OpenMeshType &m, const char * filename, int &loadmask, CallBackPos */*cb*/=0)
|
||||||
{
|
{
|
||||||
CTMcontext context;
|
CTMcontext context;
|
||||||
|
|
||||||
|
@ -106,14 +106,14 @@ static int Open( OpenMeshType &m, const char * filename, int &loadmask, CallBack
|
||||||
// Extract colors
|
// Extract colors
|
||||||
m.Clear();
|
m.Clear();
|
||||||
Allocator<OpenMeshType>::AddVertices(m, vertCount);
|
Allocator<OpenMeshType>::AddVertices(m, vertCount);
|
||||||
for(int i=0;i<vertCount;++i)
|
for(unsigned int i=0;i<vertCount;++i)
|
||||||
m.vert[i].P()=Point3f(vertices[i*3+0],vertices[i*3+1],vertices[i*3+2]);
|
m.vert[i].P()=Point3f(vertices[i*3+0],vertices[i*3+1],vertices[i*3+2]);
|
||||||
|
|
||||||
CTMenum colorAttrib = ctmGetNamedAttribMap(context,"Color");
|
CTMenum colorAttrib = ctmGetNamedAttribMap(context,"Color");
|
||||||
if(colorAttrib != CTM_NONE)
|
if(colorAttrib != CTM_NONE)
|
||||||
{
|
{
|
||||||
const CTMfloat *colors = ctmGetFloatArray(context,colorAttrib);
|
const CTMfloat *colors = ctmGetFloatArray(context,colorAttrib);
|
||||||
for(int i=0;i<vertCount;++i)
|
for(unsigned int i=0;i<vertCount;++i)
|
||||||
m.vert[i].C()=Color4b(colors[i*4+0]*255,colors[i*4+1]*255,colors[i*4+2]*255,colors[i*4+3]*255);
|
m.vert[i].C()=Color4b(colors[i*4+0]*255,colors[i*4+1]*255,colors[i*4+2]*255,colors[i*4+3]*255);
|
||||||
loadmask |= Mask::IOM_VERTCOLOR;
|
loadmask |= Mask::IOM_VERTCOLOR;
|
||||||
}
|
}
|
||||||
|
@ -122,13 +122,18 @@ static int Open( OpenMeshType &m, const char * filename, int &loadmask, CallBack
|
||||||
if(qualityAttrib != CTM_NONE)
|
if(qualityAttrib != CTM_NONE)
|
||||||
{
|
{
|
||||||
const CTMfloat *qualities = ctmGetFloatArray(context,colorAttrib);
|
const CTMfloat *qualities = ctmGetFloatArray(context,colorAttrib);
|
||||||
for(int i=0;i<vertCount;++i)
|
for(unsigned int i=0;i<vertCount;++i)
|
||||||
m.vert[i].Q()=qualities[i*4+0];
|
m.vert[i].Q()=qualities[i*4+0];
|
||||||
loadmask |= Mask::IOM_VERTQUALITY;
|
loadmask |= Mask::IOM_VERTQUALITY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(triCount==1)
|
||||||
|
{
|
||||||
|
if(indices[0]==0 && indices[1]==0 && indices[2]==0)
|
||||||
|
triCount=0;
|
||||||
|
}
|
||||||
Allocator<OpenMeshType>::AddFaces(m, triCount);
|
Allocator<OpenMeshType>::AddFaces(m, triCount);
|
||||||
for(int i=0;i<triCount;++i)
|
for(unsigned int i=0;i<triCount;++i)
|
||||||
{
|
{
|
||||||
m.face[i].V(0)=&m.vert[indices[i*3+0]];
|
m.face[i].V(0)=&m.vert[indices[i*3+0]];
|
||||||
m.face[i].V(1)=&m.vert[indices[i*3+1]];
|
m.face[i].V(1)=&m.vert[indices[i*3+1]];
|
||||||
|
@ -139,8 +144,7 @@ static int Open( OpenMeshType &m, const char * filename, int &loadmask, CallBack
|
||||||
}
|
}
|
||||||
|
|
||||||
int result = E_NOERROR;
|
int result = E_NOERROR;
|
||||||
|
return result;
|
||||||
return result;
|
|
||||||
} // end of Open
|
} // end of Open
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue