Fixed some bugs in the collada loader and activated proper material usage. Now, collada 1.4 meshes are also textured and colored.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1204 dfc29bdd-3216-0410-991c-e03cc46cb475
master
hybrid 2008-01-25 00:12:46 +00:00
parent 78b1d0f18c
commit 6d7357c3c5
1 changed files with 14 additions and 7 deletions

View File

@ -1096,8 +1096,8 @@ void CColladaFileLoader::readImage(io::IXMLReaderUTF8* reader)
SColladaImage& image=Images.getLast(); SColladaImage& image=Images.getLast();
image.Id = readId(reader); image.Id = readId(reader);
image.Dimension.Height = (u32)reader->getAttributeValue("height"); image.Dimension.Height = (u32)reader->getAttributeValueAsInt("height");
image.Dimension.Width = (u32)reader->getAttributeValue("width"); image.Dimension.Width = (u32)reader->getAttributeValueAsInt("width");
if (Version >= 10400) // start with 1.4 if (Version >= 10400) // start with 1.4
{ {
@ -1110,6 +1110,7 @@ void CColladaFileLoader::readImage(io::IXMLReaderUTF8* reader)
else else
if (initFromName == reader->getNodeName()) if (initFromName == reader->getNodeName())
{ {
reader->read();
image.Source = reader->getNodeData(); image.Source = reader->getNodeData();
image.Source.trim(); image.Source.trim();
image.SourceIsFilename=true; image.SourceIsFilename=true;
@ -1117,6 +1118,7 @@ void CColladaFileLoader::readImage(io::IXMLReaderUTF8* reader)
else else
if (dataName == reader->getNodeName()) if (dataName == reader->getNodeName())
{ {
reader->read();
image.Source = reader->getNodeData(); image.Source = reader->getNodeData();
image.Source.trim(); image.Source.trim();
image.SourceIsFilename=false; image.SourceIsFilename=false;
@ -1273,8 +1275,8 @@ void CColladaFileLoader::readEffect(io::IXMLReaderUTF8* reader, SColladaEffect *
if (reader->getNodeType() == io::EXN_ELEMENT) if (reader->getNodeType() == io::EXN_ELEMENT)
{ {
// first come the tags we descend, but ignore the top-levels // first come the tags we descend, but ignore the top-levels
if ((profileCOMMONSectionName == reader->getNodeName()) || if (!reader->isEmptyElement() && ((profileCOMMONSectionName == reader->getNodeName()) ||
(techniqueNodeName == reader->getNodeName())) (techniqueNodeName == reader->getNodeName())))
readEffect(reader,effect); readEffect(reader,effect);
else else
if (newParamName == reader->getNodeName()) if (newParamName == reader->getNodeName())
@ -1391,7 +1393,7 @@ void CColladaFileLoader::readEffect(io::IXMLReaderUTF8* reader, SColladaEffect *
} }
} }
else else
if (extraNodeName == reader->getNodeName()) if (!reader->isEmptyElement() && (extraNodeName == reader->getNodeName()))
readEffect(reader,effect); readEffect(reader,effect);
else else
if (doubleSidedName == reader->getNodeName()) if (doubleSidedName == reader->getNodeName())
@ -1950,6 +1952,8 @@ void CColladaFileLoader::readPolygonSection(io::IXMLReaderUTF8* reader,
for (u32 i=0; i<polygons.size(); ++i) for (u32 i=0; i<polygons.size(); ++i)
{ {
core::array<u16> indices; core::array<u16> indices;
const u32 vertexCount = polygons[i].Indices.size() / maxOffset;
mbuffer->Vertices.reallocate(mbuffer->Vertices.size()+vertexCount);
// for all index/semantic groups // for all index/semantic groups
for (u32 v=0; v<polygons[i].Indices.size(); v+=maxOffset) for (u32 v=0; v<polygons[i].Indices.size(); v+=maxOffset)
@ -2039,8 +2043,8 @@ void CColladaFileLoader::readPolygonSection(io::IXMLReaderUTF8* reader,
for (u32 i=0; i<polygons.size(); ++i) for (u32 i=0; i<polygons.size(); ++i)
{ {
u32 vertexCount = polygons[i].Indices.size() / maxOffset; const u32 vertexCount = polygons[i].Indices.size() / maxOffset;
mbuffer->Vertices.reallocate(mbuffer->Vertices.size()+vertexCount);
// for all vertices in array // for all vertices in array
for (u32 v=0; v<polygons[i].Indices.size(); v+=maxOffset) for (u32 v=0; v<polygons[i].Indices.size(); v+=maxOffset)
{ {
@ -2103,6 +2107,9 @@ void CColladaFileLoader::readPolygonSection(io::IXMLReaderUTF8* reader,
} // end for all polygons } // end for all polygons
} }
const SColladaMaterial* m = findMaterial(materialName);
if (m)
buffer->getMaterial() = m->Mat;
// add future bind reference for the material // add future bind reference for the material
core::stringc materialReference = geometryId+"/"+materialName; core::stringc materialReference = geometryId+"/"+materialName;
if (!MaterialsToBind.find(materialReference)) if (!MaterialsToBind.find(materialReference))