now load file without instance_geometry

This commit is contained in:
granzuglia 2006-11-05 15:40:51 +00:00
parent ab38499165
commit 2f79d55207
1 changed files with 234 additions and 214 deletions

View File

@ -12,79 +12,10 @@ namespace io {
template<typename OpenMeshType>
class ImporterDAE : public UtilDAE
{
public:
//merge all meshes in the collada's file in the templeted mesh m
//I assume the mesh
static int Open(OpenMeshType& m,const char* filename,AdditionalInfo*& addinfo)
private:
static int LoadMesh(OpenMeshType& m,InfoDAE* info,const QDomNode& geo)
{
AdditionalInfoDAE* inf = new AdditionalInfoDAE();
inf->dae = new InfoDAE();
InfoDAE* info = inf->dae;
QDomDocument* doc = new QDomDocument(filename);
QFile file(filename);
if (!file.open(QIODevice::ReadOnly))
return E_CANTOPEN;
if (!doc->setContent(&file))
{
file.close();
return E_CANTOPEN;
}
file.close();
info->doc = doc;
QDomNodeList& scenes = info->doc->elementsByTagName("scene");
int scn_size = scenes.size();
if (scn_size == 0)
return E_NO3DSCENE;
//Is there geometry in the file?
bool geoinst_found = false;
//for each scene in COLLADA FILE
for(int scn = 0;scn < scn_size;++scn)
{
QDomNodeList& instscenes = scenes.at(scn).toElement().elementsByTagName("instance_visual_scene");
int instscn_size = instscenes.size();
if (instscn_size == 0)
return E_INCOMPATIBLECOLLADA141FORMAT;
//for each scene instance in a COLLADA scene
for(int instscn = 0;instscn < instscn_size; ++instscn)
{
QString libscn_url;
referenceToANodeAttribute(instscenes.at(instscn),"url",libscn_url);
QDomNode nd = QDomNode(*(info->doc));
QDomNode visscn = findNodeBySpecificAttributeValue(*(info->doc),"visual_scene","id",libscn_url);
if(visscn.isNull())
return E_UNREFERENCEBLEDCOLLADAATTRIBUTE;
//for each node in the libscn_url visual scene
QDomNodeList& visscn_child = visscn.childNodes();
//for each direct child of a libscn_url visual scene find if there is some geometry instance
for(int chdind = 0; chdind < visscn_child.size();++chdind)
{
QDomNodeList& geoinst = visscn_child.at(chdind).toElement().elementsByTagName("instance_geometry");
int geoinst_size = geoinst.size();
if (geoinst_size != 0)
{
geoinst_found |= true;
QDomNodeList& geolib = info->doc->elementsByTagName("library_geometries");
int geolib_size = geolib.size();
assert(geolib_size == 1);
//!!!!!!!!!!!!!!!!!here will be the code for geometry transformations!!!!!!!!!!!!!!!!!!!!!!
for(int geoinst_ind = 0;geoinst_ind < geoinst_size;++geoinst_ind)
{
QString geo_url;
referenceToANodeAttribute(geoinst.at(geoinst_ind),"url",geo_url);
QDomNode geo = findNodeBySpecificAttributeValue(geolib.at(0),"geometry","id",geo_url);
if (geo.isNull())
return E_UNREFERENCEBLEDCOLLADAATTRIBUTE;
if (isThereTag(geo,"mesh"))
{
/*QDomNodeList geosrc = geo.toElement().elementsByTagName("source");
@ -294,7 +225,84 @@ namespace io {
}
}
return E_NOERROR;
}
else return E_NOMESH;
}
public:
//merge all meshes in the collada's file in the templeted mesh m
//I assume the mesh
static int Open(OpenMeshType& m,const char* filename,AdditionalInfo*& addinfo)
{
AdditionalInfoDAE* inf = new AdditionalInfoDAE();
inf->dae = new InfoDAE();
InfoDAE* info = inf->dae;
QDomDocument* doc = new QDomDocument(filename);
QFile file(filename);
if (!file.open(QIODevice::ReadOnly))
return E_CANTOPEN;
if (!doc->setContent(&file))
{
file.close();
return E_CANTOPEN;
}
file.close();
info->doc = doc;
QDomNodeList& scenes = info->doc->elementsByTagName("scene");
int scn_size = scenes.size();
if (scn_size == 0)
return E_NO3DSCENE;
//Is there geometry in the file?
bool geoinst_found = false;
//for each scene in COLLADA FILE
for(int scn = 0;scn < scn_size;++scn)
{
QDomNodeList& instscenes = scenes.at(scn).toElement().elementsByTagName("instance_visual_scene");
int instscn_size = instscenes.size();
if (instscn_size == 0)
return E_INCOMPATIBLECOLLADA141FORMAT;
//for each scene instance in a COLLADA scene
for(int instscn = 0;instscn < instscn_size; ++instscn)
{
QString libscn_url;
referenceToANodeAttribute(instscenes.at(instscn),"url",libscn_url);
QDomNode nd = QDomNode(*(info->doc));
QDomNode visscn = findNodeBySpecificAttributeValue(*(info->doc),"visual_scene","id",libscn_url);
if(visscn.isNull())
return E_UNREFERENCEBLEDCOLLADAATTRIBUTE;
//for each node in the libscn_url visual scene
QDomNodeList& visscn_child = visscn.childNodes();
//for each direct child of a libscn_url visual scene find if there is some geometry instance
int problem = 0;
for(int chdind = 0; chdind < visscn_child.size();++chdind)
{
QDomNodeList& geoinst = visscn_child.at(chdind).toElement().elementsByTagName("instance_geometry");
int geoinst_size = geoinst.size();
if (geoinst_size != 0)
{
geoinst_found |= true;
QDomNodeList& geolib = info->doc->elementsByTagName("library_geometries");
int geolib_size = geolib.size();
assert(geolib_size == 1);
//!!!!!!!!!!!!!!!!!here will be the code for geometry transformations!!!!!!!!!!!!!!!!!!!!!!
for(int geoinst_ind = 0;geoinst_ind < geoinst_size;++geoinst_ind)
{
QString geo_url;
referenceToANodeAttribute(geoinst.at(geoinst_ind),"url",geo_url);
QDomNode geo = findNodeBySpecificAttributeValue(geolib.at(0),"geometry","id",geo_url);
if (geo.isNull())
return E_UNREFERENCEBLEDCOLLADAATTRIBUTE;
problem |= LoadMesh(m,info,geo);
if (problem) return problem;
}
}
}
@ -302,7 +310,19 @@ namespace io {
}
if (!geoinst_found)
return E_NOGEOMETRYLIBRARY;
{
QDomNodeList& geolib = info->doc->elementsByTagName("library_geometries");
int geolib_size = geolib.size();
assert(geolib_size == 1);
QDomNodeList& geochild = geolib.at(0).childNodes();
int geochild_size = geochild.size();
int problem = 0;
for(int chd = 0;chd < geochild_size;++chd)
{
problem |= LoadMesh(m,info,geochild.at(chd));
if (problem) return problem;
}
}
addinfo = inf;
return E_NOERROR;
}