polylist importer's first version
This commit is contained in:
parent
1fee504228
commit
9adde831bf
|
@ -14,6 +14,146 @@ namespace io {
|
||||||
{
|
{
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
static int WedgeNormalAttribute(OpenMeshType& m,const QStringList face,const QStringList wn,const QDomNode wnsrc,const int meshfaceind,const int faceind,const int component)
|
||||||
|
{
|
||||||
|
int indnm = -1;
|
||||||
|
if (!wnsrc.isNull())
|
||||||
|
{
|
||||||
|
indnm = face.at(faceind).toInt();
|
||||||
|
assert(indnm * 3 < wn.size());
|
||||||
|
m.face[meshfaceind].WN(component) = vcg::Point3f(wn.at(indnm * 3).toFloat(),wn.at(indnm * 3 + 1).toFloat(),wn.at(indnm * 3 + 2).toFloat());
|
||||||
|
}
|
||||||
|
return indnm;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int WedgeTextureAttribute(OpenMeshType& m,const QStringList face,const QStringList wt,const QDomNode wtsrc,const int meshfaceind,const int faceind,const int component)
|
||||||
|
{
|
||||||
|
int indtx = -1;
|
||||||
|
if (!wtsrc.isNull())
|
||||||
|
{
|
||||||
|
indtx = face.at(faceind).toInt();
|
||||||
|
assert(indtx * 2 < wt.size());
|
||||||
|
m.face[meshfaceind].WT(component) = vcg::TexCoord2<float>();
|
||||||
|
m.face[meshfaceind].WT(component).u() = wt.at(indtx * 2).toFloat();
|
||||||
|
m.face[meshfaceind].WT(component).v() = wt.at(indtx * 2 + 1).toFloat();
|
||||||
|
m.face[meshfaceind].WT(component).n() = 1;
|
||||||
|
}
|
||||||
|
return indtx;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int WedgeColorAttribute(OpenMeshType& m,const QStringList face,const QStringList wc,const QDomNode wcsrc,const int meshfaceind,const int faceind,const int component)
|
||||||
|
{
|
||||||
|
int indcl;
|
||||||
|
if (!wcsrc.isNull())
|
||||||
|
{
|
||||||
|
indcl = face.at(faceind).toInt();
|
||||||
|
assert(indcl * 4 < wc.size());
|
||||||
|
m.face[meshfaceind].WC(component) = vcg::Color4b(wc.at(indcl * 4).toFloat(),wc.at(indcl * 4 + 1).toFloat(),wc.at(indcl * 4 + 2).toFloat(),wc.at(indcl * 4 + 3).toFloat());
|
||||||
|
}
|
||||||
|
return indcl;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void FindStandardWedgeAttributes(WedgeAttribute& wed,const QDomNode nd,const QDomDocument doc)
|
||||||
|
{
|
||||||
|
wed.wnsrc = findNodeBySpecificAttributeValue(nd,"input","semantic","NORMAL");
|
||||||
|
wed.offnm = findStringListAttribute(wed.wn,wed.wnsrc,nd,doc,"NORMAL");
|
||||||
|
|
||||||
|
wed.wtsrc = findNodeBySpecificAttributeValue(nd,"input","semantic","TEXCOORD");
|
||||||
|
wed.offtx = findStringListAttribute(wed.wt,wed.wtsrc,nd,doc,"TEXCOORD");
|
||||||
|
|
||||||
|
wed.wcsrc = findNodeBySpecificAttributeValue(nd,"input","semantic","COLOR");
|
||||||
|
wed.offcl = findStringListAttribute(wed.wc,wed.wcsrc,nd,doc,"COLOR");
|
||||||
|
}
|
||||||
|
|
||||||
|
static DAEError LoadPolygonalMesh(QDomNodeList& polypatch,OpenMeshType& m,const size_t offset,AdditionalInfoDAE* info)
|
||||||
|
{
|
||||||
|
return E_NOERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DAEError LoadPolygonalListMesh(QDomNodeList& polylist,OpenMeshType& m,const size_t offset,AdditionalInfoDAE* info)
|
||||||
|
{
|
||||||
|
PolygonalMesh pm;
|
||||||
|
for(OpenMeshType::VertexIterator itv = m.vert.begin();itv != m.vert.end();++itv)
|
||||||
|
{
|
||||||
|
vcg::Point3f p(itv->P().X(),itv->P().Y(),itv->P().Z());
|
||||||
|
pm.vert.push_back(p);
|
||||||
|
}
|
||||||
|
int polylist_size = polylist.size();
|
||||||
|
for(int pl = 0; pl < polylist_size;++pl)
|
||||||
|
{
|
||||||
|
PolygonalMesh::PERWEDGEATTRIBUTETYPE att = PolygonalMesh::NONE;
|
||||||
|
WedgeAttribute wa;
|
||||||
|
FindStandardWedgeAttributes(wa,polylist.at(pl),*(info->dae->doc));
|
||||||
|
|
||||||
|
QStringList vertcount;
|
||||||
|
valueStringList(vertcount,polylist.at(pl),"vcount");
|
||||||
|
int indforpol = findOffSetForASingleSimplex(polylist.at(pl));
|
||||||
|
int offpols = 0;
|
||||||
|
int npolig = vertcount.size();
|
||||||
|
QStringList polyind;
|
||||||
|
valueStringList(polyind,polylist.at(pl),"p");
|
||||||
|
for(unsigned int ii = 0;ii < npolig;++ii)
|
||||||
|
{
|
||||||
|
int nvert = vertcount.at(ii).toInt();
|
||||||
|
MyPolygon p(nvert);
|
||||||
|
if (!wa.wnsrc.isNull())
|
||||||
|
p.usePerWedgeNormal();
|
||||||
|
if (!wa.wcsrc.isNull())
|
||||||
|
p.usePerWedgeColor();
|
||||||
|
if (!wa.wtsrc.isNull())
|
||||||
|
p.usePerWedgeMultiTexture();
|
||||||
|
|
||||||
|
for(unsigned int iv = 0;iv < nvert;++iv)
|
||||||
|
{
|
||||||
|
int index = offset + polyind.at(offpols + iv * indforpol).toInt();
|
||||||
|
p._pv[iv] = &(pm.vert[index]);
|
||||||
|
}
|
||||||
|
pm._pols.push_back(p);
|
||||||
|
offpols += nvert * indforpol;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pm.triangulate(m);
|
||||||
|
return E_NOERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DAEError LoadTriangularMesh(QDomNodeList& tripatch,OpenMeshType& m,const size_t offset,AdditionalInfoDAE* info)
|
||||||
|
{
|
||||||
|
int tripatch_size = tripatch.size();
|
||||||
|
for(int tript = 0; tript < tripatch_size;++tript)
|
||||||
|
{
|
||||||
|
|
||||||
|
int nfcatt = tripatch.at(tript).toElement().elementsByTagName("input").size();
|
||||||
|
|
||||||
|
QStringList face;
|
||||||
|
valueStringList(face,tripatch.at(tript),"p");
|
||||||
|
int face_size = face.size();
|
||||||
|
int offsetface = (int)m.face.size();
|
||||||
|
if (face_size == 0) return E_NOMESH;
|
||||||
|
vcg::tri::Allocator<OpenMeshType>::AddFaces(m,face_size / (nfcatt * 3));
|
||||||
|
WedgeAttribute wa;
|
||||||
|
FindStandardWedgeAttributes(wa,tripatch.at(tript),*(info->dae->doc));
|
||||||
|
|
||||||
|
int jj = 0;
|
||||||
|
//int dd = m.face.size();
|
||||||
|
for(int ff = offsetface;ff < (int) m.face.size();++ff)
|
||||||
|
{
|
||||||
|
for(unsigned int tt = 0;tt < 3;++tt)
|
||||||
|
{
|
||||||
|
int indvt = face.at(jj).toInt();
|
||||||
|
assert(indvt + offset < m.vert.size());
|
||||||
|
m.face[ff].V(tt) = &(m.vert[indvt + offset]);
|
||||||
|
|
||||||
|
int indnm = WedgeNormalAttribute(m,face,wa.wn,wa.wnsrc,ff,jj + wa.offnm,tt);
|
||||||
|
int indtx = WedgeTextureAttribute(m,face,wa.wt,wa.wtsrc,ff,jj + wa.offtx,tt);
|
||||||
|
int indcl = WedgeColorAttribute(m,face,wa.wc,wa.wcsrc,ff,jj + wa.offcl,tt);
|
||||||
|
|
||||||
|
jj += nfcatt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return E_NOERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int LoadMesh(OpenMeshType& m,AdditionalInfoDAE* info,const QDomNode& geo,const vcg::Matrix44f& t, CallBackPos *cb=0)
|
static int LoadMesh(OpenMeshType& m,AdditionalInfoDAE* info,const QDomNode& geo,const vcg::Matrix44f& t, CallBackPos *cb=0)
|
||||||
{
|
{
|
||||||
|
@ -102,147 +242,20 @@ namespace io {
|
||||||
|
|
||||||
QDomNodeList tripatch = geo.toElement().elementsByTagName("triangles");
|
QDomNodeList tripatch = geo.toElement().elementsByTagName("triangles");
|
||||||
int tripatch_size = tripatch.size();
|
int tripatch_size = tripatch.size();
|
||||||
if (tripatch_size == 0)
|
QDomNodeList polypatch = geo.toElement().elementsByTagName("polygons");
|
||||||
return E_NOTRIANGLES;
|
int polypatch_size = polypatch.size();
|
||||||
|
QDomNodeList polylist = geo.toElement().elementsByTagName("polylist");
|
||||||
|
int polylist_size = polylist.size();
|
||||||
|
if ((tripatch_size == 0) && (polypatch_size == 0) && (polylist_size == 0))
|
||||||
|
return E_NOPOLYGONALMESH;
|
||||||
|
|
||||||
for(int tript = 0; tript < tripatch_size;++tript)
|
DAEError err = E_NOERROR;
|
||||||
{
|
if (tripatch_size != 0) err = LoadTriangularMesh(tripatch,m,offset,info);
|
||||||
|
else
|
||||||
int nfcatt = tripatch.at(tript).toElement().elementsByTagName("input").size();
|
if (polypatch_size != 0) err = LoadPolygonalMesh(polypatch,m,offset,info);
|
||||||
|
else
|
||||||
QStringList face;
|
if (polylist_size != 0) err = LoadPolygonalListMesh(polylist,m,offset,info);
|
||||||
valueStringList(face,tripatch.at(tript),"p");
|
if (err != E_NOERROR) return err;
|
||||||
int face_size = face.size();
|
|
||||||
int offsetface = (int)m.face.size();
|
|
||||||
if (face_size == 0) return E_NOMESH;
|
|
||||||
vcg::tri::Allocator<OpenMeshType>::AddFaces(m,face_size / (nfcatt * 3));
|
|
||||||
QDomNode wnsrc = QDomNode();
|
|
||||||
QStringList wn;
|
|
||||||
wnsrc = findNodeBySpecificAttributeValue(tripatch.at(tript),"input","semantic","NORMAL");
|
|
||||||
int offnm;
|
|
||||||
if (!wnsrc.isNull())
|
|
||||||
{
|
|
||||||
offnm = wnsrc.toElement().attribute("offset").toInt();
|
|
||||||
QDomNode sn = attributeSourcePerSimplex(tripatch.at(tript),*(info->dae->doc),"NORMAL");
|
|
||||||
valueStringList(wn,sn,"float_array");
|
|
||||||
}
|
|
||||||
|
|
||||||
QDomNode wtsrc = QDomNode();
|
|
||||||
QStringList wt;
|
|
||||||
wtsrc = findNodeBySpecificAttributeValue(tripatch.at(tript),"input","semantic","TEXCOORD");
|
|
||||||
int offtx;
|
|
||||||
if (!wtsrc.isNull())
|
|
||||||
{
|
|
||||||
offtx = wtsrc.toElement().attribute("offset").toInt();
|
|
||||||
QDomNode st = attributeSourcePerSimplex(tripatch.at(tript),*(info->dae->doc),"TEXCOORD");
|
|
||||||
valueStringList(wt,st,"float_array");
|
|
||||||
}
|
|
||||||
|
|
||||||
QDomNode wcsrc = QDomNode();
|
|
||||||
QStringList wc;
|
|
||||||
wcsrc = findNodeBySpecificAttributeValue(tripatch.at(tript),"input","semantic","COLOR");
|
|
||||||
int offcl;
|
|
||||||
if (!wcsrc.isNull())
|
|
||||||
{
|
|
||||||
offcl = wcsrc.toElement().attribute("offset").toInt();
|
|
||||||
QDomNode sc = attributeSourcePerSimplex(tripatch.at(tript),*(info->dae->doc),"COLOR");
|
|
||||||
valueStringList(wc,sc,"float_array");
|
|
||||||
}
|
|
||||||
|
|
||||||
int jj = 0;
|
|
||||||
//int dd = m.face.size();
|
|
||||||
for(int ff = offsetface;ff < (int) m.face.size();++ff)
|
|
||||||
{
|
|
||||||
int indvt = face.at(jj).toInt();
|
|
||||||
assert(indvt + offset < m.vert.size());
|
|
||||||
m.face[ff].V(0) = &(m.vert[indvt + offset]);
|
|
||||||
|
|
||||||
int indnm;
|
|
||||||
if (!wnsrc.isNull())
|
|
||||||
{
|
|
||||||
indnm = face.at(jj + offnm).toInt();
|
|
||||||
assert(indnm * 3 < wn.size());
|
|
||||||
m.face[ff].WN(0) = vcg::Point3f(wn.at(indnm * 3).toFloat(),wn.at(indnm * 3 + 1).toFloat(),wn.at(indnm * 3 + 2).toFloat());
|
|
||||||
}
|
|
||||||
|
|
||||||
int indtx;
|
|
||||||
if (!wtsrc.isNull())
|
|
||||||
{
|
|
||||||
indtx = face.at(jj + offtx).toInt();
|
|
||||||
assert(indtx * 2 < wt.size());
|
|
||||||
m.face[ff].WT(0) = vcg::TexCoord2<float>();
|
|
||||||
m.face[ff].WT(0).u() = wt.at(indtx * 2).toFloat();
|
|
||||||
m.face[ff].WT(0).v() = wt.at(indtx * 2 + 1).toFloat();
|
|
||||||
m.face[ff].WT(0).n() = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*int indcl;
|
|
||||||
if (!wcsrc.isNull())
|
|
||||||
{
|
|
||||||
indcl = face.at(jj + offcl).toInt();
|
|
||||||
assert(indcl * 4 < wc.size());
|
|
||||||
m.face[ff].WC(0) = vcg::Color4b(wc.at(indcl * 4).toFloat(),wc.at(indcl * 4 + 1).toFloat(),wc.at(indcl * 4 + 2).toFloat(),wc.at(indcl * 4 + 3).toFloat());
|
|
||||||
}*/
|
|
||||||
jj += nfcatt;
|
|
||||||
|
|
||||||
indvt = face.at(jj).toInt();
|
|
||||||
assert(indvt + offset < m.vert.size());
|
|
||||||
m.face[ff].V(1) = &(m.vert[indvt + offset]);
|
|
||||||
if (!wnsrc.isNull())
|
|
||||||
{
|
|
||||||
indnm = face.at(jj + offnm).toInt();
|
|
||||||
assert(indnm * 3 < wn.size());
|
|
||||||
m.face[ff].WN(1) = vcg::Point3f(wn.at(indnm * 3).toFloat(),wn.at(indnm * 3 + 1).toFloat(),wn.at(indnm * 3 + 2).toFloat());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!wtsrc.isNull())
|
|
||||||
{
|
|
||||||
indtx = face.at(jj + offtx).toInt();
|
|
||||||
assert(indtx * 2 < wt.size());
|
|
||||||
m.face[ff].WT(1) = vcg::TexCoord2<float>();
|
|
||||||
m.face[ff].WT(1).u() = wt.at(indtx * 2).toFloat();
|
|
||||||
m.face[ff].WT(1).v() = wt.at(indtx * 2 + 1).toFloat();
|
|
||||||
m.face[ff].WT(1).n() = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*if (!wcsrc.isNull())
|
|
||||||
{
|
|
||||||
indcl = face.at(jj + offcl).toInt();
|
|
||||||
assert(indcl * 4 < wc.size());
|
|
||||||
m.face[ff].WC(1) = vcg::Color4b(wc.at(indcl * 4).toFloat(),wc.at(indcl * 4 + 1).toFloat(),wc.at(indcl * 4 + 2).toFloat(),wc.at(indcl * 4 + 3).toFloat());
|
|
||||||
}*/
|
|
||||||
jj += nfcatt;
|
|
||||||
|
|
||||||
indvt = face.at(jj).toInt();
|
|
||||||
assert(indvt + offset < m.vert.size());
|
|
||||||
m.face[ff].V(2) = &(m.vert[indvt + offset]);
|
|
||||||
if (!wnsrc.isNull())
|
|
||||||
{
|
|
||||||
indnm = face.at(jj + offnm).toInt();
|
|
||||||
assert(indnm * 3 < wn.size());
|
|
||||||
m.face[ff].WN(2) = vcg::Point3f(wn.at(indnm * 3).toFloat(),wn.at(indnm * 3 + 1).toFloat(),wn.at(indnm * 3 + 2).toFloat());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!wtsrc.isNull())
|
|
||||||
{
|
|
||||||
indtx = face.at(jj + offtx).toInt();
|
|
||||||
assert(indtx * 2 < wt.size());
|
|
||||||
m.face[ff].WT(2) = vcg::TexCoord2<float>();
|
|
||||||
m.face[ff].WT(2).u() = wt.at(indtx * 2).toFloat();
|
|
||||||
m.face[ff].WT(2).v() = wt.at(indtx * 2 + 1).toFloat();
|
|
||||||
m.face[ff].WT(2).n() = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*if (!wcsrc.isNull())
|
|
||||||
{
|
|
||||||
indcl = face.at(jj + offcl).toInt();
|
|
||||||
assert(indcl * 4 < wc.size());
|
|
||||||
m.face[ff].WC(2) = vcg::Color4b(wc.at(indcl * 4).toFloat(),wc.at(indcl * 4 + 1).toFloat(),wc.at(indcl * 4 + 2).toFloat(),wc.at(indcl * 4 + 3).toFloat());
|
|
||||||
}*/
|
|
||||||
jj += nfcatt;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return E_NOERROR;
|
return E_NOERROR;
|
||||||
}
|
}
|
||||||
|
@ -468,7 +481,11 @@ namespace io {
|
||||||
bHasPerVertexText = true;
|
bHasPerVertexText = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QDomNodeList facelist = geo.toElement().elementsByTagName("triangles");
|
const char* arr[] = {"triangles","polylist","polygons"};
|
||||||
|
|
||||||
|
for(unsigned int tt= 0;tt < 3;++tt)
|
||||||
|
{
|
||||||
|
QDomNodeList facelist = geo.toElement().elementsByTagName(arr[tt]);
|
||||||
for(int face = 0;face < facelist.size();++face)
|
for(int face = 0;face < facelist.size();++face)
|
||||||
{
|
{
|
||||||
info->numface += facelist.at(face).toElement().attribute("count").toInt() ;
|
info->numface += facelist.at(face).toElement().attribute("count").toInt() ;
|
||||||
|
@ -485,6 +502,7 @@ namespace io {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!geoinst_found)
|
if (!geoinst_found)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#ifndef __VCGLIB_UTILDAE
|
#ifndef __VCGLIB_UTILDAE
|
||||||
#define __VCGLIB_UTILDAE
|
#define __VCGLIB_UTILDAE
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include <wrap/io_trimesh/additionalinfo.h>
|
#include <wrap/io_trimesh/additionalinfo.h>
|
||||||
#include <vcg/complex/trimesh/update/normal.h>
|
#include <vcg/complex/trimesh/update/normal.h>
|
||||||
#include <vcg/complex/trimesh/allocate.h>
|
#include <vcg/complex/trimesh/allocate.h>
|
||||||
|
@ -14,8 +16,20 @@
|
||||||
#include<vcg/space/point3.h>
|
#include<vcg/space/point3.h>
|
||||||
#include<vcg/space/texcoord2.h>
|
#include<vcg/space/texcoord2.h>
|
||||||
#include<vcg/space/color4.h>
|
#include<vcg/space/color4.h>
|
||||||
|
#include<vcg/space/texcoord2.h>
|
||||||
#include <wrap/callback.h>
|
#include <wrap/callback.h>
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <vcg/simplex/vertex/with/vn.h>
|
||||||
|
#include <vcg/simplex/edge/edge.h>
|
||||||
|
|
||||||
|
#ifndef CALLBACK
|
||||||
|
#define CALLBACK __stdcall
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <wrap/gl/glu_tesselator.h>
|
||||||
|
|
||||||
namespace vcg {
|
namespace vcg {
|
||||||
namespace tri {
|
namespace tri {
|
||||||
namespace io {
|
namespace io {
|
||||||
|
@ -71,7 +85,151 @@ namespace io {
|
||||||
E_NO3DSCENE, // 6
|
E_NO3DSCENE, // 6
|
||||||
E_INCOMPATIBLECOLLADA141FORMAT, //7
|
E_INCOMPATIBLECOLLADA141FORMAT, //7
|
||||||
E_UNREFERENCEBLEDCOLLADAATTRIBUTE, // 8
|
E_UNREFERENCEBLEDCOLLADAATTRIBUTE, // 8
|
||||||
E_NOTRIANGLES
|
E_NOPOLYGONALMESH
|
||||||
|
};
|
||||||
|
|
||||||
|
class MyPolygon;
|
||||||
|
class MyEdge;
|
||||||
|
class MyVertex:public vcg::VertexVNf<MyEdge , MyPolygon, MyEdge>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MyVertex()
|
||||||
|
:vcg::VertexVNf<MyEdge , MyPolygon, MyEdge>()
|
||||||
|
{
|
||||||
|
_flags = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
MyVertex(MyVertex::CoordType& v)
|
||||||
|
{
|
||||||
|
_flags = 0;
|
||||||
|
P() = v;
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class MyPolygon
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int _nvert;
|
||||||
|
std::vector<MyVertex*> _pv;
|
||||||
|
std::vector< std::vector<vcg::TexCoord2<> > > _wtx;
|
||||||
|
std::vector<vcg::Point3f> _wnm;
|
||||||
|
std::vector< std::vector<vcg::Color4f> > _wcl;
|
||||||
|
|
||||||
|
|
||||||
|
MyPolygon(int n)
|
||||||
|
:_nvert(n),_pv(_nvert)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void usePerWedgeColor(const unsigned int multicolor = 1)
|
||||||
|
{
|
||||||
|
_wcl.resize(_nvert);
|
||||||
|
for(unsigned int ii = 0;ii < multicolor;++ii)
|
||||||
|
_wcl[ii].resize(multicolor);
|
||||||
|
}
|
||||||
|
|
||||||
|
void usePerWedgeNormal()
|
||||||
|
{
|
||||||
|
_wnm.resize(_nvert);
|
||||||
|
}
|
||||||
|
|
||||||
|
void usePerWedgeMultiTexture(const unsigned int multitex = 1)
|
||||||
|
{
|
||||||
|
_wtx.resize(_nvert);
|
||||||
|
for(unsigned int ii = 0;ii < multitex;++ii)
|
||||||
|
_wtx[ii].resize(multitex);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class MyEdge: public vcg::Edge<MyEdge,MyVertex>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MyEdge(MyVertex* v1,MyVertex* v2)
|
||||||
|
:vcg::Edge<MyEdge,MyVertex>(v1,v2)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class PolygonalMesh
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
enum PERWEDGEATTRIBUTETYPE {NONE = 0,NORMAL = 1,MULTITEXTURECOORD = 2,MULTICOLOR = 4};
|
||||||
|
|
||||||
|
typedef MyVertex::BaseVertexType VertexType;
|
||||||
|
typedef VertexType* VertexPointer;
|
||||||
|
typedef std::vector<MyVertex>::iterator VertexIterator;
|
||||||
|
typedef std::vector<MyPolygon>::iterator PolygonIterator;
|
||||||
|
|
||||||
|
vcg::Box3<float> bbox;
|
||||||
|
|
||||||
|
std::vector<MyVertex> vert;
|
||||||
|
std::vector<MyPolygon> _pols;
|
||||||
|
|
||||||
|
void generatePointsVector(std::vector<std::vector<vcg::Point3f>>& v)
|
||||||
|
{
|
||||||
|
for(PolygonalMesh::PolygonIterator itp = _pols.begin();itp != _pols.end();++itp)
|
||||||
|
{
|
||||||
|
v.push_back(std::vector<vcg::Point3f>());
|
||||||
|
for(std::vector<MyVertex*>::iterator itv = itp->_pv.begin();itv != itp->_pv.end();++itv)
|
||||||
|
{
|
||||||
|
v[v.size() - 1].push_back((*itv)->P());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void usePerWedgeAttributes(PERWEDGEATTRIBUTETYPE att,const unsigned int multitexture = 1,const unsigned int multicolor = 1)
|
||||||
|
{
|
||||||
|
if (att != NONE)
|
||||||
|
{
|
||||||
|
for(PolygonIterator itp = _pols.begin();itp != _pols.end();++itp)
|
||||||
|
{
|
||||||
|
if (att & MULTICOLOR) itp->usePerWedgeColor(multicolor);
|
||||||
|
if (att & MULTITEXTURECOORD) itp->usePerWedgeMultiTexture(multitexture);
|
||||||
|
if (att & NORMAL) itp->usePerWedgeNormal();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename TRIMESH>
|
||||||
|
void triangulate(TRIMESH& mesh)
|
||||||
|
{
|
||||||
|
std::vector<std::vector<vcg::Point3f>> pl;
|
||||||
|
mesh.vert.resize(vert.size());
|
||||||
|
|
||||||
|
//PolygonalMesh's points been copied in TriangularMesh
|
||||||
|
for(size_t jj = 0;jj < mesh.vert.size();++jj)
|
||||||
|
mesh.vert[jj].P() = vert[jj].P();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//transform the polygonal mesh in a vector<vector<Point>>
|
||||||
|
generatePointsVector(pl);
|
||||||
|
|
||||||
|
|
||||||
|
//foreach Polygon
|
||||||
|
for(size_t ii = 0;ii < pl.size();++ii)
|
||||||
|
{
|
||||||
|
std::vector<int> tx;
|
||||||
|
std::vector<std::vector<vcg::Point3f>> pl2(1);
|
||||||
|
pl2[0] = pl[ii];
|
||||||
|
|
||||||
|
vcg::glu_tesselator::tesselate(pl2,tx);
|
||||||
|
size_t ntri = tx.size() / 3;
|
||||||
|
assert(tx.size() % 3 == 0);
|
||||||
|
|
||||||
|
//foreach triangle
|
||||||
|
for(size_t tr = 0;tr < ntri;++tr)
|
||||||
|
{
|
||||||
|
TRIMESH::FaceType f;
|
||||||
|
for(unsigned int tt = 0;tt < 3; ++tt)
|
||||||
|
f.V(tt) = &(mesh.vert[_pols[ii]._pv[tx[3 * tr + tt]] - &(vert[0])]);
|
||||||
|
mesh.face.push_back(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *ErrorMsg(int error)
|
static const char *ErrorMsg(int error)
|
||||||
|
@ -87,7 +245,7 @@ namespace io {
|
||||||
"There isn't any scene in Collada file",
|
"There isn't any scene in Collada file",
|
||||||
"The input file is not compatible with COLLADA 1.41 standard format",
|
"The input file is not compatible with COLLADA 1.41 standard format",
|
||||||
"Collada file is trying to referece an attribute that is not in the file",
|
"Collada file is trying to referece an attribute that is not in the file",
|
||||||
"This version of Collada Importer support only triangular mesh file"
|
"This version of Collada Importer support only triangular and polygonal mesh file"
|
||||||
};
|
};
|
||||||
|
|
||||||
if(error>9 || error<0) return "Unknown error";
|
if(error>9 || error<0) return "Unknown error";
|
||||||
|
@ -265,6 +423,49 @@ namespace io {
|
||||||
TransfMatrix(parentnode,par,m);
|
TransfMatrix(parentnode,par,m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline static int findOffSetForASingleSimplex(QDomNode node)
|
||||||
|
{
|
||||||
|
QDomNodeList wedatts = node.toElement().elementsByTagName("input");
|
||||||
|
int max = 0;
|
||||||
|
if (wedatts.size() == 0) return -1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(unsigned int ii = 0;ii < wedatts.size();++ii)
|
||||||
|
{
|
||||||
|
int tmp = wedatts.at(ii).toElement().attribute("offset").toInt();
|
||||||
|
if (tmp > max) max = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return max + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline static int findStringListAttribute(QStringList& list,const QDomNode node,const QDomNode poly,const QDomDocument startpoint,const char* token)
|
||||||
|
{
|
||||||
|
int offset;
|
||||||
|
if (!node.isNull())
|
||||||
|
{
|
||||||
|
offset = node.toElement().attribute("offset").toInt();
|
||||||
|
QDomNode st = attributeSourcePerSimplex(poly,startpoint,token);
|
||||||
|
valueStringList(list,st,"float_array");
|
||||||
|
}
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct WedgeAttribute
|
||||||
|
{
|
||||||
|
QDomNode wnsrc;
|
||||||
|
QStringList wn;
|
||||||
|
int offnm;
|
||||||
|
|
||||||
|
QDomNode wtsrc;
|
||||||
|
QStringList wt;
|
||||||
|
int offtx;
|
||||||
|
|
||||||
|
QDomNode wcsrc;
|
||||||
|
QStringList wc;
|
||||||
|
int offcl;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue