added real supports for multiple textures

This commit is contained in:
granzuglia 2007-09-25 10:29:29 +00:00
parent 76721c28d1
commit a1502da3fd
2 changed files with 86 additions and 9 deletions

View File

@ -26,7 +26,7 @@ namespace io {
return indnm; return indnm;
} }
static int WedgeTextureAttribute(OpenMeshType& m,const QStringList face,QString texture,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)
{ {
int indtx = -1; int indtx = -1;
if (!wtsrc.isNull()) if (!wtsrc.isNull())
@ -37,7 +37,8 @@ namespace io {
m.face[meshfaceind].WT(component).U() = wt.at(indtx * 2).toFloat(); 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).V() = wt.at(indtx * 2 + 1).toFloat();
m.face[meshfaceind].WT(component).N() = 1; m.face[meshfaceind].WT(component).N() = ind_txt;
} }
return indtx; return indtx;
} }
@ -124,11 +125,11 @@ namespace io {
{ {
QString mat = tripatch.at(tript).toElement().attribute(QString("material")); QString mat = tripatch.at(tript).toElement().attribute(QString("material"));
QDomNodeList libim = info->dae->doc->elementsByTagName(QString("library_images")); QDomNode txt_node = textureFinder(mat,*(info->dae->doc));
if (libim.size() == 1) int ind_txt = -1;
{ if (!txt_node.isNull())
QDomNode img = findNodeBySpecificAttributeValue(libim.at(0).childNodes(),QString("id"),mat); ind_txt = indexTextureByImgNode(*(info->dae->doc),txt_node);
}
int nfcatt = tripatch.at(tript).toElement().elementsByTagName("input").size(); int nfcatt = tripatch.at(tript).toElement().elementsByTagName("input").size();
QStringList face; QStringList face;
@ -152,7 +153,8 @@ namespace io {
int indnm = WedgeNormalAttribute(m,face,wa.wn,wa.wnsrc,ff,jj + wa.offnm,tt); int indnm = WedgeNormalAttribute(m,face,wa.wn,wa.wnsrc,ff,jj + wa.offnm,tt);
int indtx = WedgeTextureAttribute(m,face,mat,wa.wt,wa.wtsrc,ff,jj + wa.offtx,tt); 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); int indcl = WedgeColorAttribute(m,face,wa.wc,wa.wcsrc,ff,jj + wa.offcl,tt);
jj += nfcatt; jj += nfcatt;

View File

@ -263,7 +263,8 @@ namespace io {
int ind = 0; int ind = 0;
while(ind < ndl_size) while(ind < ndl_size)
{ {
if (ndl.at(ind).toElement().attribute(attrname) == attrvalue) QString st = ndl.at(ind).toElement().attribute(attrname);
if (st == attrvalue)
return ndl.at(ind); return ndl.at(ind);
++ind; ++ind;
} }
@ -448,6 +449,80 @@ namespace io {
return offset; return offset;
} }
inline static QDomNode textureFinder(const QString& textname,const QDomDocument doc)
{
//visual_scene -> instance_material
QDomNodeList vis_scn = doc.elementsByTagName("library_visual_scenes");
if (vis_scn.size() != 1)
return QDomNode();
QDomNode symb = findNodeBySpecificAttributeValue(vis_scn.at(0),QString("instance_material"),QString("symbol"),textname);
if (symb.isNull())
return QDomNode();
QString tar = symb.toElement().attribute("target");
if (tar.isNull())
return QDomNode();
tar = tar.remove('#');
//library_material -> material -> instance_effect
QDomNodeList lib_mat = doc.elementsByTagName("library_materials");
if (lib_mat.size() != 1)
return QDomNode();
QDomNode material = findNodeBySpecificAttributeValue(lib_mat.at(0),QString("material"),QString("id"),tar);
if (material.isNull())
return QDomNode();
QDomNodeList in_eff = material.toElement().elementsByTagName("instance_effect");
if (vis_scn.size() == 0)
return QDomNode();
QString url = in_eff.at(0).toElement().attribute("url");
if ((url.isNull()) || (url == ""))
return QDomNode();
url = url.remove('#');
//library_effects -> effect -> instance_effect
QDomNodeList lib_eff = doc.elementsByTagName("library_effects");
if (lib_eff.size() != 1)
return QDomNode();
QDomNode effect = findNodeBySpecificAttributeValue(lib_eff.at(0),QString("effect"),QString("id"),url);
if (effect.isNull())
return QDomNode();
QDomNodeList init_from = effect.toElement().elementsByTagName("init_from");
if (init_from.size() == 0)
return QDomNode();
QString img_id = init_from.at(0).toElement().text();
if ((img_id.isNull()) || (img_id == ""))
return QDomNode();
//library_images -> image
QDomNodeList lib_img = doc.elementsByTagName("library_images");
if (lib_img.size() != 1)
return QDomNode();
QDomNode img = findNodeBySpecificAttributeValue(lib_img.at(0),QString("image"),QString("id"),img_id);
if (img.isNull())
return QDomNode();
return img;
}
static int indexTextureByImgNode(const QDomDocument doc,const QDomNode node)
{
QDomNodeList libim = doc.elementsByTagName(QString("library_images"));
if (libim.size() != 1)
return -1;
QDomNodeList imgs = libim.at(0).toElement().elementsByTagName("image");
int ii = 0;
bool found = false;
while((ii < imgs.size()) && (!found))
{
if (imgs.at(ii) == node)
found = true;
else ++ii;
}
if (found)
return ii;
else
return -1;
}
struct WedgeAttribute struct WedgeAttribute
{ {
QDomNode wnsrc; QDomNode wnsrc;