added support for multiple textures
fixed many stupid bugs
This commit is contained in:
parent
b0346b1ab9
commit
d91bb25e52
|
|
@ -5,6 +5,7 @@
|
||||||
#include <vcg/space/point4.h>
|
#include <vcg/space/point4.h>
|
||||||
#include <QtGui/QImage>
|
#include <QtGui/QImage>
|
||||||
#include <wrap/dae/meshaccessors.h>
|
#include <wrap/dae/meshaccessors.h>
|
||||||
|
#include <QtCore/QVector>
|
||||||
|
|
||||||
namespace Collada
|
namespace Collada
|
||||||
{
|
{
|
||||||
|
|
@ -527,11 +528,17 @@ namespace Tags
|
||||||
class TrianglesTag : public XMLTag
|
class TrianglesTag : public XMLTag
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
TrianglesTag(const int count)
|
||||||
|
:XMLTag("triangles")
|
||||||
|
{
|
||||||
|
_attributes.push_back(TagAttribute("count",QString::number(count)));
|
||||||
|
}
|
||||||
|
|
||||||
TrianglesTag(const int count,const QString& material)
|
TrianglesTag(const int count,const QString& material)
|
||||||
:XMLTag("triangles")
|
:XMLTag("triangles")
|
||||||
{
|
{
|
||||||
_attributes.push_back(TagAttribute("count",QString::number(count)));
|
_attributes.push_back(TagAttribute("count",QString::number(count)));
|
||||||
_attributes.push_back(TagAttribute("semantic",material));
|
_attributes.push_back(TagAttribute("material",material));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -558,6 +565,27 @@ namespace Tags
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename MESHTYPE>
|
||||||
|
PTag(const MESHTYPE& m,const unsigned int nedge,QVector<int>& patchfaces,bool norm = false,bool texcoord = false)
|
||||||
|
:XMLLeafTag("p")
|
||||||
|
{
|
||||||
|
int cont = 0;
|
||||||
|
for(QVector<int>::iterator it = patchfaces.begin();it != patchfaces .end(); ++it)
|
||||||
|
{
|
||||||
|
for(unsigned int ii = 0; ii < nedge; ++ii)
|
||||||
|
{
|
||||||
|
const MESHTYPE::FaceType& f = m.face[*it];
|
||||||
|
int dist = f.V(ii) - &(*m.vert.begin());
|
||||||
|
_text.push_back(QString::number(dist));
|
||||||
|
if (norm)
|
||||||
|
_text.push_back(QString::number(*it));
|
||||||
|
if (texcoord)
|
||||||
|
_text.push_back(QString::number(*it * nedge + ii));
|
||||||
|
}
|
||||||
|
++cont;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* template<typename MESHTYPE,typename POLYGONACCESSOR1,typename POLYGONACCESSOR2>
|
/* template<typename MESHTYPE,typename POLYGONACCESSOR1,typename POLYGONACCESSOR2>
|
||||||
PTag(const MESHTYPE& m,const POLYGONACCESSOR1>& p1,const AccessorInfo<POLYGONACCESSOR2>& p2)
|
PTag(const MESHTYPE& m,const POLYGONACCESSOR1>& p1,const AccessorInfo<POLYGONACCESSOR2>& p2)
|
||||||
:XMLLeafTag("p")
|
:XMLLeafTag("p")
|
||||||
|
|
@ -744,6 +772,19 @@ private:
|
||||||
node0->_sons.push_back(node1);
|
node0->_sons.push_back(node1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename MESHMODELTYPE>
|
||||||
|
static void splitMeshInTexturedPatches(const MESHMODELTYPE& m,QVector<QVector<int>>& patches)
|
||||||
|
{
|
||||||
|
patches.resize(m.textures.size());
|
||||||
|
int cc = 0;
|
||||||
|
for(MESHMODELTYPE::ConstFaceIterator itf = m.face.begin();itf != m.face.end();++itf)
|
||||||
|
{
|
||||||
|
int tmp = itf->cWT(0).N();
|
||||||
|
patches[tmp].push_back(cc);
|
||||||
|
++cc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
template<typename MESHMODELTYPE>
|
template<typename MESHMODELTYPE>
|
||||||
static XMLDocument* createColladaDocument(const MESHMODELTYPE& m,const int mask)
|
static XMLDocument* createColladaDocument(const MESHMODELTYPE& m,const int mask)
|
||||||
|
|
@ -921,7 +962,7 @@ public:
|
||||||
{
|
{
|
||||||
XNode* sourcewedge = new XNode(new Tags::SourceTag(shape+"-lib-map","map"));
|
XNode* sourcewedge = new XNode(new Tags::SourceTag(shape+"-lib-map","map"));
|
||||||
AccessorComponentNumberInfo<MESHMODELTYPE,MeshAccessors::PolygonWedgeTextureCoordinateAccessor<const MESHMODELTYPE>> pwacc(m);
|
AccessorComponentNumberInfo<MESHMODELTYPE,MeshAccessors::PolygonWedgeTextureCoordinateAccessor<const MESHMODELTYPE>> pwacc(m);
|
||||||
pwacc._return_value_component_number = CoordNumber<MESHMODELTYPE::FaceType::TexCoordType::PointType>::coord();;
|
pwacc._return_value_component_number = CoordNumber<MESHMODELTYPE::FaceType::TexCoordType::PointType>::coord();
|
||||||
//we export only triangular face
|
//we export only triangular face
|
||||||
XLeaf* floatwedgearr = new XLeaf(new Tags::FloatWedgeArrayTag(shape+"-lib-map-array",m.face.size() * pwacc._return_value_component_number * edgefacenum,m,pwacc));
|
XLeaf* floatwedgearr = new XLeaf(new Tags::FloatWedgeArrayTag(shape+"-lib-map-array",m.face.size() * pwacc._return_value_component_number * edgefacenum,m,pwacc));
|
||||||
XNode* techcommwedgenode = new XNode(new Tags::TechniqueCommonTag());
|
XNode* techcommwedgenode = new XNode(new Tags::TechniqueCommonTag());
|
||||||
|
|
@ -942,31 +983,72 @@ public:
|
||||||
meshnode->_sons.push_back(sourcewedge);
|
meshnode->_sons.push_back(sourcewedge);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
XNode* vertnode = new XNode(new Tags::VerticesTag(shape+"-lib-vertices"));
|
XNode* vertnode = new XNode(new Tags::VerticesTag(shape+"-lib-vertices"));
|
||||||
XNode* inputposnode = new XNode(new Tags::InputTag("POSITION",shape+"-lib-positions"));
|
XNode* inputposnode = new XNode(new Tags::InputTag("POSITION",shape+"-lib-positions"));
|
||||||
vertnode->_sons.push_back(inputposnode);
|
vertnode->_sons.push_back(inputposnode);
|
||||||
meshnode->_sons.push_back(vertnode);
|
meshnode->_sons.push_back(vertnode);
|
||||||
XNode* trianglesnode = new XNode(new Tags::TrianglesTag(m.face.size(),"instancematerial"));
|
XNode* trianglesnode = NULL;
|
||||||
XNode* inputtrinode = new XNode(new Tags::InputTag(0,"VERTEX",shape+"-lib-vertices"));
|
//if ((m.textures.size() == 0) || (!texmask))
|
||||||
trianglesnode->_sons.push_back(inputtrinode);
|
//{
|
||||||
if (normalmask)
|
// //there isn't any texture file
|
||||||
{
|
// trianglesnode = new XNode(new Tags::TrianglesTag(m.face.size()));
|
||||||
XNode* inputnormnode = new XNode(new Tags::InputTag(1,"NORMAL",shape+"-lib-normals"));
|
//}
|
||||||
trianglesnode->_sons.push_back(inputnormnode);
|
//else
|
||||||
}
|
//{
|
||||||
|
// std::vector<std::vector<int>> _mytripatches(m.textures.size());
|
||||||
|
// if ((texmask) && (m.textures.size() > 1))
|
||||||
|
// {
|
||||||
|
// //there are many textures files - I have to split the mesh in triangular patches that share the same texture's file.
|
||||||
|
// for(MESHMODELTYPE::ConstFaceIterator itf = m.face.begin();itf != m.face.end();++itf)
|
||||||
|
// {
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
// trianglesnode = new XNode(new Tags::TrianglesTag(m.face.size(),"instancematerial"));
|
||||||
|
//}
|
||||||
|
|
||||||
|
QVector<QVector<int>> mytripatches;
|
||||||
if (texmask)
|
if (texmask)
|
||||||
|
splitMeshInTexturedPatches(m,mytripatches);
|
||||||
|
|
||||||
|
QVector<QVector<int>>::iterator itp = mytripatches.begin();
|
||||||
|
int indmat = 0;
|
||||||
|
do
|
||||||
{
|
{
|
||||||
XNode* inputwedgenode = new XNode(new Tags::InputTag(2,"TEXCOORD",shape+"-lib-map"));
|
if ((m.textures.size() == 0) || (!texmask))
|
||||||
trianglesnode->_sons.push_back(inputwedgenode);
|
{
|
||||||
}
|
//there isn't any texture file
|
||||||
|
trianglesnode = new XNode(new Tags::TrianglesTag(m.face.size()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
trianglesnode = new XNode(new Tags::TrianglesTag(mytripatches[indmat].size(),"instancematerial" + QString::number(indmat)));
|
||||||
|
|
||||||
XLeaf* polyleaf = new XLeaf(new Tags::PTag(m,edgefacenum,normalmask,texmask));
|
XNode* inputtrinode = new XNode(new Tags::InputTag(0,"VERTEX",shape+"-lib-vertices"));
|
||||||
|
trianglesnode->_sons.push_back(inputtrinode);
|
||||||
|
if (normalmask)
|
||||||
|
{
|
||||||
|
XNode* inputnormnode = new XNode(new Tags::InputTag(1,"NORMAL",shape+"-lib-normals"));
|
||||||
|
trianglesnode->_sons.push_back(inputnormnode);
|
||||||
|
}
|
||||||
|
|
||||||
trianglesnode->_sons.push_back(polyleaf);
|
if (texmask)
|
||||||
meshnode->_sons.push_back(trianglesnode);
|
{
|
||||||
|
XNode* inputwedgenode = new XNode(new Tags::InputTag(2,"TEXCOORD",shape+"-lib-map"));
|
||||||
|
trianglesnode->_sons.push_back(inputwedgenode);
|
||||||
|
}
|
||||||
|
|
||||||
|
XLeaf* polyleaf = NULL;
|
||||||
|
if (itp == mytripatches.end())
|
||||||
|
polyleaf = new XLeaf(new Tags::PTag(m,edgefacenum,normalmask,texmask));
|
||||||
|
else
|
||||||
|
polyleaf = new XLeaf(new Tags::PTag(m,edgefacenum,(*itp),normalmask,texmask));
|
||||||
|
|
||||||
|
trianglesnode->_sons.push_back(polyleaf);
|
||||||
|
meshnode->_sons.push_back(trianglesnode);
|
||||||
|
|
||||||
|
++indmat;
|
||||||
|
++itp;
|
||||||
|
}while(itp != mytripatches.end());
|
||||||
|
|
||||||
connectHierarchyNode(libgeo,geometrynode,meshnode);
|
connectHierarchyNode(libgeo,geometrynode,meshnode);
|
||||||
root->_sons.push_back(libgeo);
|
root->_sons.push_back(libgeo);
|
||||||
|
|
||||||
|
|
@ -974,11 +1056,14 @@ public:
|
||||||
XNode* visualscenenode = new XNode(new Tags::VisualSceneTag("VisualSceneNode","VisualScene"));
|
XNode* visualscenenode = new XNode(new Tags::VisualSceneTag("VisualSceneNode","VisualScene"));
|
||||||
XNode* nodenode = new XNode(new Tags::NodeTag("node","node"));
|
XNode* nodenode = new XNode(new Tags::NodeTag("node","node"));
|
||||||
XNode* instgeonode = new XNode(new Tags::InstanceGeometryTag(shape+"-lib"));
|
XNode* instgeonode = new XNode(new Tags::InstanceGeometryTag(shape+"-lib"));
|
||||||
XNode* bindnode = new XNode(new Tags::BindMaterialTag());
|
for(unsigned int ii = 0; ii < m.textures.size(); ++ii)
|
||||||
XNode* techcommmatnode = new XNode(new Tags::TechniqueCommonTag());
|
{
|
||||||
XNode* instmatnode = new XNode(new Tags::InstanceMaterialTag("instancematerial","material0"));
|
XNode* bindnode = new XNode(new Tags::BindMaterialTag());
|
||||||
XNode* bindvertnode = new XNode(new Tags::BindVertexInputTag("UVSET0","TEXCOORD","0"));
|
XNode* techcommmatnode = new XNode(new Tags::TechniqueCommonTag());
|
||||||
connectHierarchyNode(instgeonode,bindnode,techcommmatnode,instmatnode,bindvertnode);
|
XNode* instmatnode = new XNode(new Tags::InstanceMaterialTag("instancematerial" + QString::number(ii),"material" + QString::number(ii)));
|
||||||
|
XNode* bindvertnode = new XNode(new Tags::BindVertexInputTag("UVSET0","TEXCOORD","0"));
|
||||||
|
connectHierarchyNode(instgeonode,bindnode,techcommmatnode,instmatnode,bindvertnode);
|
||||||
|
}
|
||||||
connectHierarchyNode(visualscenenode,nodenode,instgeonode);
|
connectHierarchyNode(visualscenenode,nodenode,instgeonode);
|
||||||
libvisualnode->_sons.push_back(visualscenenode);
|
libvisualnode->_sons.push_back(visualscenenode);
|
||||||
root->_sons.push_back(libvisualnode);
|
root->_sons.push_back(libvisualnode);
|
||||||
|
|
|
||||||
|
|
@ -243,7 +243,6 @@ namespace io {
|
||||||
inline static QDomNode findNodeBySpecificAttributeValue(const QDomNodeList& ndl,const QString& attrname,const QString& attrvalue)
|
inline static QDomNode findNodeBySpecificAttributeValue(const QDomNodeList& ndl,const QString& attrname,const QString& attrvalue)
|
||||||
{
|
{
|
||||||
int ndl_size = ndl.size();
|
int ndl_size = ndl.size();
|
||||||
assert(ndl_size != 0);
|
|
||||||
int ind = 0;
|
int ind = 0;
|
||||||
while(ind < ndl_size)
|
while(ind < ndl_size)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue