fixed stride bug on texture

This commit is contained in:
granzuglia 2007-12-18 11:06:46 +00:00
parent fd58c7c501
commit 2afde2785c
2 changed files with 79 additions and 28 deletions

View File

@ -26,16 +26,16 @@ namespace io {
return indnm; return indnm;
} }
static int WedgeTextureAttribute(OpenMeshType& m,const QStringList face,int ind_txt,const QStringList wt,const QDomNode wtsrc,const int meshfaceind,const int faceind,const int component) static int WedgeTextureAttribute(OpenMeshType& m,const QStringList face,int ind_txt,const QStringList wt,const QDomNode wtsrc,const int meshfaceind,const int faceind,const int component,const int stride = 2)
{ {
int indtx = -1; int indtx = -1;
if (!wtsrc.isNull()) if (!wtsrc.isNull())
{ {
indtx = face.at(faceind).toInt(); indtx = face.at(faceind).toInt();
assert(indtx * 2 < wt.size()); assert(indtx * stride < wt.size());
m.face[meshfaceind].WT(component) = vcg::TexCoord2<float>(); m.face[meshfaceind].WT(component) = vcg::TexCoord2<float>();
m.face[meshfaceind].WT(component).U() = wt.at(indtx * 2).toFloat(); m.face[meshfaceind].WT(component).U() = wt.at(indtx * stride).toFloat();
m.face[meshfaceind].WT(component).V() = wt.at(indtx * 2 + 1).toFloat(); m.face[meshfaceind].WT(component).V() = wt.at(indtx * stride + 1).toFloat();
m.face[meshfaceind].WT(component).N() = ind_txt; m.face[meshfaceind].WT(component).N() = ind_txt;
@ -61,12 +61,26 @@ namespace io {
wed.offnm = findStringListAttribute(wed.wn,wed.wnsrc,nd,doc,"NORMAL"); wed.offnm = findStringListAttribute(wed.wn,wed.wnsrc,nd,doc,"NORMAL");
wed.wtsrc = findNodeBySpecificAttributeValue(nd,"input","semantic","TEXCOORD"); wed.wtsrc = findNodeBySpecificAttributeValue(nd,"input","semantic","TEXCOORD");
if (!wed.wtsrc.isNull())
{
QDomNode src = attributeSourcePerSimplex(nd,doc,"TEXCOORD");
if (isThereTag(src,"accessor"))
{
QDomNodeList wedatts = src.toElement().elementsByTagName("accessor");
wed.stride = wedatts.at(0).toElement().attribute("stride").toInt();
}
else
wed.stride = 2;
}
else
wed.stride = 2;
wed.offtx = findStringListAttribute(wed.wt,wed.wtsrc,nd,doc,"TEXCOORD"); wed.offtx = findStringListAttribute(wed.wt,wed.wtsrc,nd,doc,"TEXCOORD");
wed.wcsrc = findNodeBySpecificAttributeValue(nd,"input","semantic","COLOR"); wed.wcsrc = findNodeBySpecificAttributeValue(nd,"input","semantic","COLOR");
wed.offcl = findStringListAttribute(wed.wc,wed.wcsrc,nd,doc,"COLOR"); wed.offcl = findStringListAttribute(wed.wc,wed.wcsrc,nd,doc,"COLOR");
} }
static DAEError LoadPolygonalMesh(QDomNodeList& polypatch,OpenMeshType& m,const size_t offset,AdditionalInfoDAE* info) static DAEError LoadPolygonalMesh(QDomNodeList& polypatch,OpenMeshType& m,const size_t offset,AdditionalInfoDAE* info)
{ {
return E_NOERROR; return E_NOERROR;
@ -76,6 +90,8 @@ namespace io {
{ {
typedef PolygonalMesh< MyPolygon<typename OpenMeshType::VertexType> > PolyMesh; typedef PolygonalMesh< MyPolygon<typename OpenMeshType::VertexType> > PolyMesh;
PolyMesh pm; PolyMesh pm;
//copying vertices
for(typename OpenMeshType::VertexIterator itv = m.vert.begin();itv != m.vert.end();++itv) for(typename OpenMeshType::VertexIterator itv = m.vert.begin();itv != m.vert.end();++itv)
{ {
vcg::Point3f p(itv->P().X(),itv->P().Y(),itv->P().Z()); vcg::Point3f p(itv->P().X(),itv->P().Y(),itv->P().Z());
@ -83,13 +99,19 @@ namespace io {
v.P() = p; v.P() = p;
pm.vert.push_back(v); pm.vert.push_back(v);
} }
int polylist_size = polylist.size(); int polylist_size = polylist.size();
for(int pl = 0; pl < polylist_size;++pl) for(int pl = 0; pl < polylist_size;++pl)
{ {
typename PolyMesh::PERWEDGEATTRIBUTETYPE att = PolyMesh::NONE; QString mat = polylist.at(pl).toElement().attribute(QString("material"));
QDomNode txt_node = textureFinder(mat,*(info->dae->doc));
int ind_txt = -1;
if (!txt_node.isNull())
ind_txt = indexTextureByImgNode(*(info->dae->doc),txt_node);
//PolyMesh::PERWEDGEATTRIBUTETYPE att = PolyMesh::NONE;
WedgeAttribute wa; WedgeAttribute wa;
FindStandardWedgeAttributes(wa,polylist.at(pl),*(info->dae->doc)); FindStandardWedgeAttributes(wa,polylist.at(pl),*(info->dae->doc));
QStringList vertcount; QStringList vertcount;
valueStringList(vertcount,polylist.at(pl),"vcount"); valueStringList(vertcount,polylist.at(pl),"vcount");
int indforpol = findOffSetForASingleSimplex(polylist.at(pl)); int indforpol = findOffSetForASingleSimplex(polylist.at(pl));
@ -97,26 +119,27 @@ namespace io {
int npolig = vertcount.size(); int npolig = vertcount.size();
QStringList polyind; QStringList polyind;
valueStringList(polyind,polylist.at(pl),"p"); valueStringList(polyind,polylist.at(pl),"p");
for(unsigned int ii = 0;ii < npolig;++ii) for(int ii = 0;ii < npolig;++ii)
{ {
int nvert = vertcount.at(ii).toInt(); int nvert = vertcount.at(ii).toInt();
typename PolyMesh::FaceType p(nvert); typename PolyMesh::FaceType p(nvert);
for(unsigned int iv = 0;iv < nvert;++iv) for(int iv = 0;iv < nvert;++iv)
{ {
int index = offset + polyind.at(offpols + iv * indforpol).toInt(); int index = offset + polyind.at(offpols + iv * indforpol).toInt();
p._pv[iv] = &(pm.vert[index]); p._pv[iv] = &(pm.vert[index]);
int nmindex = -1; int nmindex = -1;
if (!wa.wnsrc.isNull())
{ if (!wa.wnsrc.isNull())
nmindex = offset + polyind.at(offpols + iv * indforpol + wa.offnm).toInt(); nmindex = offset + polyind.at(offpols + iv * indforpol + wa.offnm).toInt();
}
int txindex = -1; int txindex = -1;
if (!wa.wtsrc.isNull()) if (!wa.wtsrc.isNull())
{ {
txindex = offset + polyind.at(offpols + iv * indforpol + wa.offtx).toInt(); txindex = offset + polyind.at(offpols + iv * indforpol + wa.offtx).toInt();
/*p._txc[iv].U() = wa.wt.at(txindex * 2).toFloat();
p._txc[iv].V() = wa.wt.at(txindex * 2 + 1).toFloat();
p._txc[iv].N() = ind_txt;*/
} }
} }
pm._pols.push_back(p); pm._pols.push_back(p);
@ -133,7 +156,6 @@ namespace io {
for(int tript = 0; tript < tripatch_size;++tript) for(int tript = 0; tript < tripatch_size;++tript)
{ {
QString mat = tripatch.at(tript).toElement().attribute(QString("material")); QString mat = tripatch.at(tript).toElement().attribute(QString("material"));
QDomNode txt_node = textureFinder(mat,*(info->dae->doc)); QDomNode txt_node = textureFinder(mat,*(info->dae->doc));
int ind_txt = -1; int ind_txt = -1;
if (!txt_node.isNull()) if (!txt_node.isNull())
@ -154,17 +176,20 @@ namespace io {
//int dd = m.face.size(); //int dd = m.face.size();
for(int ff = offsetface;ff < (int) m.face.size();++ff) for(int ff = offsetface;ff < (int) m.face.size();++ff)
{ {
for(unsigned int tt = 0;tt < 3;++tt) for(unsigned int tt = 0;tt < 3;++tt)
{ {
int indvt = face.at(jj).toInt(); int indvt = face.at(jj).toInt();
assert(indvt + offset < m.vert.size()); assert(indvt + offset < m.vert.size());
m.face[ff].V(tt) = &(m.vert[indvt + offset]); m.face[ff].V(tt) = &(m.vert[indvt + offset]);
int indnm = WedgeNormalAttribute(m,face,wa.wn,wa.wnsrc,ff,jj + wa.offnm,tt); WedgeNormalAttribute(m,face,wa.wn,wa.wnsrc,ff,jj + wa.offnm,tt);
if (ind_txt != -1) if (ind_txt != -1)
int indtx = WedgeTextureAttribute(m,face,ind_txt,wa.wt,wa.wtsrc,ff,jj + wa.offtx,tt); {
int indcl = WedgeColorAttribute(m,face,wa.wc,wa.wcsrc,ff,jj + wa.offcl,tt); WedgeTextureAttribute(m,face,ind_txt,wa.wt,wa.wtsrc,ff,jj + wa.offtx,tt,wa.stride);
}
WedgeColorAttribute(m,face,wa.wc,wa.wcsrc,ff,jj + wa.offcl,tt);
jj += nfcatt; jj += nfcatt;
} }
@ -251,6 +276,7 @@ namespace io {
if (!srcnodetext.isNull()) if (!srcnodetext.isNull())
{ {
assert((ii * 2 < geosrcverttext.size()) && (ii * 2 + 1 < geosrcverttext.size())); assert((ii * 2 < geosrcverttext.size()) && (ii * 2 + 1 < geosrcverttext.size()));
m.vert[vv].T() = vcg::TexCoord2<float>(); m.vert[vv].T() = vcg::TexCoord2<float>();
m.vert[vv].T().u() = geosrcverttext[ii * 2].toFloat(); m.vert[vv].T().u() = geosrcverttext[ii * 2].toFloat();
@ -284,7 +310,6 @@ namespace io {
static void GetTexCoord(const QDomDocument& doc,AdditionalInfoDAE* inf) static void GetTexCoord(const QDomDocument& doc,AdditionalInfoDAE* inf)
{ {
QDomNodeList txlst = doc.elementsByTagName("library_images"); QDomNodeList txlst = doc.elementsByTagName("library_images");
int s = txlst.at(0).childNodes().size();
for(int img = 0;img < txlst.at(0).childNodes().size();++img) for(int img = 0;img < txlst.at(0).childNodes().size();++img)
{ {
QDomNodeList nlst = txlst.at(0).childNodes().at(img).toElement().elementsByTagName("init_from"); QDomNodeList nlst = txlst.at(0).childNodes().at(img).toElement().elementsByTagName("init_from");

View File

@ -92,10 +92,11 @@ namespace io {
int _nvert; int _nvert;
std::vector<VERTEX_TYPE*> _pv; std::vector<VERTEX_TYPE*> _pv;
std::vector< vcg::TexCoord2<float> > _txc;
MyPolygon(int n) MyPolygon(int n)
:_nvert(n),_pv(_nvert) :_nvert(n),_pv(_nvert),_txc(_nvert)
{ {
} }
}; };
@ -148,17 +149,23 @@ namespace io {
{ {
std::vector<std::vector<vcg::Point3f> > pl; std::vector<std::vector<vcg::Point3f> > pl;
mesh.vert.resize(vert.size()); mesh.vert.resize(vert.size());
int multicoor = 0;
//PolygonalMesh's points been copied in TriangularMesh //PolygonalMesh's points has been copied in TriangularMesh
for(size_t jj = 0;jj < mesh.vert.size();++jj) for(size_t jj = 0;jj < mesh.vert.size();++jj)
mesh.vert[jj].P() = vert[jj].P(); mesh.vert[jj].P() = vert[jj].P();
bool texen = mesh.face.IsWedgeTexEnabled();
unsigned int totaltri = 0;
for(size_t ii = 0;ii < _pols.size();++ii)
totaltri += _pols[ii]._nvert - 2;
mesh.face.resize(totaltri);
//transform the polygonal mesh in a vector<vector<Point>> //transform the polygonal mesh in a vector<vector<Point>>
generatePointsVector(pl); generatePointsVector(pl);
int trioff = 0;
//foreach Polygon //foreach Polygon
for(size_t ii = 0;ii < pl.size();++ii) for(size_t ii = 0;ii < pl.size();++ii)
{ {
@ -169,16 +176,34 @@ namespace io {
vcg::glu_tesselator::tesselate(pl2,tx); vcg::glu_tesselator::tesselate(pl2,tx);
size_t ntri = tx.size() / 3; size_t ntri = tx.size() / 3;
assert(tx.size() % 3 == 0); assert(tx.size() % 3 == 0);
int polvert = 0;
//foreach triangle //foreach triangle
for(size_t tr = 0;tr < ntri;++tr) for(size_t tr = 0;tr < ntri;++tr)
{ {
typename TRIMESH::FaceType f;
//typename TRIMESH::FaceType& f = mesh.face[tr];
//typename TRIMESH::FaceType& f = mesh.face[tr];
for(unsigned int tt = 0;tt < 3; ++tt) 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); mesh.face[trioff + tr].V(tt) = &(mesh.vert[_pols[ii]._pv[tx[3 * tr + tt]] - &(vert[0])]);
//vcg::Point3f ppp = mesh.face[tr].V(tt)->P();
if (texen)
{
/* f.WT(multicoor).U() = _pols[ii]._txc[polvert].U();
f.WT(multicoor).V() = _pols[ii]._txc[polvert].V();
f.WT(multicoor).N() = _pols[ii]._txc[polvert].N();*/
}
polvert = (polvert + 1) % _pols[ii]._nvert;
}
//mesh.face.push_back(f);
} }
trioff += ntri;
} }
assert(trioff == totaltri);
} }
}; };
@ -382,7 +407,7 @@ namespace io {
if (wedatts.size() == 0) return -1; if (wedatts.size() == 0) return -1;
else else
{ {
for(unsigned int ii = 0;ii < wedatts.size();++ii) for(int ii = 0;ii < wedatts.size();++ii)
{ {
int tmp = wedatts.at(ii).toElement().attribute("offset").toInt(); int tmp = wedatts.at(ii).toElement().attribute("offset").toInt();
if (tmp > max) max = tmp; if (tmp > max) max = tmp;
@ -485,6 +510,7 @@ namespace io {
QDomNode wtsrc; QDomNode wtsrc;
QStringList wt; QStringList wt;
int stride;
int offtx; int offtx;
QDomNode wcsrc; QDomNode wcsrc;