vcglib/wrap/io_trimesh/export_dae.h

235 lines
7.5 KiB
C
Raw Normal View History

#ifndef __VCGLIB_EXPORTERDAE
#define __VCGLIB_EXPORTERDAE
2006-11-03 00:58:33 +01:00
#include<wrap/io_trimesh/util_dae.h>
namespace vcg {
namespace tri {
namespace io {
//FCollada Library assumes that SaveMeshType::ScalarType is always a float
template<typename SaveMeshType>
2006-11-03 00:58:33 +01:00
class ExporterDAE : public UtilDAE
{
public:
2006-09-22 08:04:22 +02:00
static int Save(SaveMeshType &m, const char * filename,AdditionalInfo*& in)
{
2006-11-03 00:58:33 +01:00
/*unsigned int ncomp = sizeof(SaveMeshType::CoordType) / sizeof(SaveMeshType::ScalarType);*/
2006-09-22 08:04:22 +02:00
assert(in != NULL);
AdditionalInfoDAE* inf = static_cast<AdditionalInfoDAE*>(in);
InfoDAE* info = inf->dae;
2006-11-03 00:58:33 +01:00
QDomNodeList scenelst = info->doc->elementsByTagName("scene");
2006-11-03 14:09:15 +01:00
removeChildNode(scenelst,"instance_visual_scene");
2006-11-03 00:58:33 +01:00
for(int vsscn = 0;vsscn < scenelst.size();++vsscn)
2006-09-22 08:04:22 +02:00
{
2006-11-03 00:58:33 +01:00
QString url = scenelst.at(vsscn).toElement().attribute("url");
2006-09-22 08:04:22 +02:00
}
2006-11-03 00:58:33 +01:00
QDomElement vsnode = info->doc->createElement("instance_visual_scene");
vsnode.setAttribute("url","#vcg-scene-node");
scenelst.at(0).appendChild(vsnode);
2006-09-22 08:04:22 +02:00
2006-11-03 14:09:15 +01:00
QDomNodeList vsscene = info->doc->elementsByTagName("library_visual_scenes");
int vsscene_size = vsscene.size();
2006-11-03 14:09:15 +01:00
assert(vsscene.size() == 1);
removeChildNode(vsscene,"visual_scene","id","vcg-scene-node");
2006-11-03 14:09:15 +01:00
QDomElement vslnode = info->doc->createElement("visual_scene");
vslnode.setAttribute("id","vcg-scene-node");
vslnode.setAttribute("name","vcg-untitled");
QDomElement vcgnode = info->doc->createElement("node");
vcgnode.setAttribute("id","vcg-node");
vcgnode.setAttribute("name","vcg-untitled");
QDomElement vcginst = info->doc->createElement("instance_geometry");
vcginst.setAttribute("url","#vcg-mesh-lib");
vcgnode.appendChild(vcginst);
vslnode.appendChild(vcgnode);
vsscene.at(0).appendChild(vslnode);
2006-11-03 00:58:33 +01:00
QDomNodeList geolib = info->doc->elementsByTagName("library_geometries");
assert(geolib.size() == 1);
2006-11-03 14:09:15 +01:00
//removeChildNode(geolib.at(0));
2006-09-22 08:04:22 +02:00
2006-11-03 00:58:33 +01:00
/*QDomElement mshnode;
mshnode.setTagName("mesh");*/
removeChildNode(geolib.at(0),"geometry","id","vcg-mesh-lib");
2006-11-03 14:09:15 +01:00
QDomElement geonode = info->doc->createElement("geometry");
geonode.setAttribute("id","vcg-mesh-lib");
geonode.setAttribute("name","vcg-mesh");
QDomElement meshnode = info->doc->createElement("mesh");
QDomElement srcposnode = info->doc->createElement("source");
srcposnode.setAttribute("id","vcg-mesh-positions");
srcposnode.setAttribute("name","vcg-mesh-positions");
QDomElement arrayposnode = info->doc->createElement("float_array");
arrayposnode.setAttribute("id","vcg-mesh-positions-array");
2006-11-03 14:09:15 +01:00
QString arrp;
QString arrn;
int nvert = 0;
2006-11-03 14:09:15 +01:00
for(SaveMeshType::VertexIterator it = m.vert.begin();it != m.vert.end();++it)
{
if (!(it->IsD()))
{
arrp.append(QString::number(it->P().X()) + " " +QString::number(it->P().Y()) + " " + QString::number(it->P().Z()) + " ");
arrn.append(QString::number(it->N().X()) + " " + QString::number(it->N().Y()) + " " + QString::number(it->N().Z())+ " ");
++nvert;
}
2006-11-03 14:09:15 +01:00
}
arrayposnode.setAttribute("count",QString::number(nvert * 3));
2006-11-03 14:09:15 +01:00
QDomText ap = info->doc->createTextNode(arrp);
QDomElement technode = info->doc->createElement("technique_common");
QDomElement accnode = info->doc->createElement("accessor");
accnode.setAttribute("source","#vcg-mesh-positions-array");
accnode.setAttribute("count",QString::number(nvert));
2006-11-03 14:09:15 +01:00
accnode.setAttribute("stride","3");
QDomElement parxnode = info->doc->createElement("param");
parxnode.setAttribute("name","X");
parxnode.setAttribute("type","float");
QDomElement parynode = info->doc->createElement("param");
parynode.setAttribute("name","Y");
parynode.setAttribute("type","float");
QDomElement parznode = info->doc->createElement("param");
parznode.setAttribute("name","Z");
parznode.setAttribute("type","float");
accnode.appendChild(parxnode);
accnode.appendChild(parynode);
accnode.appendChild(parznode);
technode.appendChild(accnode);
arrayposnode.appendChild(ap);
srcposnode.appendChild(arrayposnode);
srcposnode.appendChild(technode);
meshnode.appendChild(srcposnode);
QDomElement srcnmnode = info->doc->createElement("source");
srcnmnode.setAttribute("id","vcg-mesh-normals");
srcnmnode.setAttribute("name","vcg-mesh-normals");
QDomElement arraynmnode = info->doc->createElement("float_array");
arraynmnode.setAttribute("id","vcg-mesh-normals-array");
arraynmnode.setAttribute("count",QString::number(nvert * 3));
2006-11-03 14:09:15 +01:00
QDomElement technode2 = info->doc->createElement("technique_common");
QDomElement accnode2 = info->doc->createElement("accessor");
accnode2.setAttribute("source","#vcg-mesh-normals-array");
accnode2.setAttribute("count",QString::number(nvert));
2006-11-03 14:09:15 +01:00
accnode2.setAttribute("stride","3");
QDomElement parxnode2 = info->doc->createElement("param");
parxnode2.setAttribute("name","X");
parxnode2.setAttribute("type","float");
QDomElement parynode2 = info->doc->createElement("param");
parynode2.setAttribute("name","Y");
parynode2.setAttribute("type","float");
QDomElement parznode2 = info->doc->createElement("param");
parznode2.setAttribute("name","Z");
parznode2.setAttribute("type","float");
QDomText an = info->doc->createTextNode(arrn);
accnode2.appendChild(parxnode2);
accnode2.appendChild(parynode2);
accnode2.appendChild(parznode2);
technode2.appendChild(accnode2);
arraynmnode.appendChild(an);
srcnmnode.appendChild(arraynmnode);
srcnmnode.appendChild(technode2);
meshnode.appendChild(srcnmnode);
QDomElement vert = info->doc->createElement("vertices");
vert.setAttribute("id","vcg-mesh-vertices");
QDomElement vinp_pos = info->doc->createElement("input");
vinp_pos.setAttribute("semantic","POSITION");
vinp_pos.setAttribute("source","#vcg-mesh-positions");
QDomElement vinp_nm = info->doc->createElement("input");
vinp_nm.setAttribute("semantic","NORMAL");
vinp_nm.setAttribute("source","#vcg-mesh-normals");
vert.appendChild(vinp_pos);
vert.appendChild(vinp_nm);
meshnode.appendChild(vert);
2006-11-03 14:09:15 +01:00
QDomElement tri = info->doc->createElement("triangles");
2006-11-03 14:09:15 +01:00
QDomElement tinp_vert = info->doc->createElement("input");
tinp_vert.setAttribute("offset","0");
tinp_vert.setAttribute("semantic","VERTEX");
tinp_vert.setAttribute("source","#vcg-mesh-vertices");
QDomElement poly = info->doc->createElement("p");
QString triangles_tess;
int nface = 0;
for(SaveMeshType::FaceIterator itf = m.face.begin();itf != m.face.end();++itf)
{
if (!(itf->IsD()))
{
for(unsigned int ii = 0;ii < 3;++ii)
{
int ind_v = (*itf).V(ii) - &(m.vert[0]);
if (triangles_tess == "")
triangles_tess = QString::number(ind_v);
else triangles_tess = triangles_tess + " " + QString::number(ind_v);
}
++nface;
}
}
tri.setAttribute("count",nface);
2006-11-03 00:58:33 +01:00
QDomText tri_list = info->doc->createTextNode(triangles_tess);
poly.appendChild(tri_list);
tri.appendChild(tinp_vert);
tri.appendChild(poly);
meshnode.appendChild(tri);
geonode.appendChild(meshnode);
geolib.at(0).appendChild(geonode);
2006-11-03 00:58:33 +01:00
QString st = info->doc->toString();
2006-11-03 00:58:33 +01:00
QFile file(filename);
if (!file.open(QIODevice::ReadWrite | QIODevice::Truncate))
return 1;
info->doc->setContent(&file);
file.write(st.toAscii());
file.close();
2006-09-22 08:04:22 +02:00
return 0;
}
static int GetExportMaskCapability()
{
int capability = 0;
//camera
//capability |= MeshModel::IOM_CAMERA;
//vert
//capability |= MeshModel::IOM_VERTTEXCOORD;
//face
capability |= MeshModel::IOM_FACEFLAGS;
//capability |= MeshModel::IOM_FACECOLOR;
capability |= MeshModel::IOM_FACENORMAL;
//wedg
//capability |= MeshModel::IOM_WEDGTEXCOORD;
capability |= MeshModel::IOM_WEDGNORMAL;
return capability;
}
};
}
}
}
#endif