Commit 42c816b6 authored by hybrid's avatar hybrid

Avoid invalid array access if not enough texcoord data is provided.

Fix texture loading for materials with more than one texture.
Choose lightmap material if more than one texture is set in a material. Other material types have to be deduced from other things, not sure about this yet.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@3633 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 95db447b
...@@ -467,12 +467,12 @@ void COgreMeshFileLoader::composeMeshBufferMaterial(scene::IMeshBuffer* mb, cons ...@@ -467,12 +467,12 @@ void COgreMeshFileLoader::composeMeshBufferMaterial(scene::IMeshBuffer* mb, cons
if ((materialName==Materials[k].Name)&&(Materials[k].Techniques.size())&&(Materials[k].Techniques[0].Passes.size())) if ((materialName==Materials[k].Name)&&(Materials[k].Techniques.size())&&(Materials[k].Techniques[0].Passes.size()))
{ {
material=Materials[k].Techniques[0].Passes[0].Material; material=Materials[k].Techniques[0].Passes[0].Material;
if (Materials[k].Techniques[0].Passes[0].Texture.Filename.size()) for (u32 i=0; i<Materials[k].Techniques[0].Passes[0].Texture.Filename.size(); ++i)
{ {
if (FileSystem->existFile(Materials[k].Techniques[0].Passes[0].Texture.Filename)) if (FileSystem->existFile(Materials[k].Techniques[0].Passes[0].Texture.Filename[i]))
material.setTexture(0, Driver->getTexture(Materials[k].Techniques[0].Passes[0].Texture.Filename)); material.setTexture(i, Driver->getTexture(Materials[k].Techniques[0].Passes[0].Texture.Filename[i]));
else else
material.setTexture(0, Driver->getTexture((CurrentlyLoadingFromPath+"/"+FileSystem->getFileBasename(Materials[k].Techniques[0].Passes[0].Texture.Filename)))); material.setTexture(i, Driver->getTexture((CurrentlyLoadingFromPath+"/"+FileSystem->getFileBasename(Materials[k].Techniques[0].Passes[0].Texture.Filename[i]))));
} }
break; break;
} }
...@@ -604,11 +604,15 @@ scene::SMeshBufferLightMap* COgreMeshFileLoader::composeMeshBufferLightMap(const ...@@ -604,11 +604,15 @@ scene::SMeshBufferLightMap* COgreMeshFileLoader::composeMeshBufferLightMap(const
{ {
u32 eSize=geom.Buffers[j].VertexSize; u32 eSize=geom.Buffers[j].VertexSize;
u32 ePos=geom.Elements[i].Offset; u32 ePos=geom.Elements[i].Offset;
// make sure we have data for a second texture coord
const bool secondCoord = (eSize>ePos+3);
for (s32 k=0; k<geom.NumVertex; ++k) for (s32 k=0; k<geom.NumVertex; ++k)
{ {
mb->Vertices[k].TCoords.set(geom.Buffers[j].Data[ePos], geom.Buffers[j].Data[ePos+1]); mb->Vertices[k].TCoords.set(geom.Buffers[j].Data[ePos], geom.Buffers[j].Data[ePos+1]);
if (secondCoord)
mb->Vertices[k].TCoords2.set(geom.Buffers[j].Data[ePos+2], geom.Buffers[j].Data[ePos+3]); mb->Vertices[k].TCoords2.set(geom.Buffers[j].Data[ePos+2], geom.Buffers[j].Data[ePos+3]);
else
mb->Vertices[k].TCoords2.set(geom.Buffers[j].Data[ePos], geom.Buffers[j].Data[ePos+1]);
ePos += eSize; ePos += eSize;
} }
} }
...@@ -688,12 +692,18 @@ scene::IMeshBuffer* COgreMeshFileLoader::composeMeshBufferSkinned(scene::CSkinne ...@@ -688,12 +692,18 @@ scene::IMeshBuffer* COgreMeshFileLoader::composeMeshBufferSkinned(scene::CSkinne
{ {
u32 eSize=geom.Buffers[j].VertexSize; u32 eSize=geom.Buffers[j].VertexSize;
u32 ePos=geom.Elements[i].Offset; u32 ePos=geom.Elements[i].Offset;
// make sure we have data for a second texture coord
const bool secondCoord = (eSize>ePos+3);
for (s32 k=0; k<geom.NumVertex; ++k) for (s32 k=0; k<geom.NumVertex; ++k)
{ {
mb->getTCoords(k).set(geom.Buffers[j].Data[ePos], geom.Buffers[j].Data[ePos+1]); mb->getTCoords(k).set(geom.Buffers[j].Data[ePos], geom.Buffers[j].Data[ePos+1]);
if (NumUV>1) if (NumUV>1)
{
if (secondCoord)
mb->Vertices_2TCoords[k].TCoords2.set(geom.Buffers[j].Data[ePos+2], geom.Buffers[j].Data[ePos+3]); mb->Vertices_2TCoords[k].TCoords2.set(geom.Buffers[j].Data[ePos+2], geom.Buffers[j].Data[ePos+3]);
else
mb->Vertices_2TCoords[k].TCoords2.set(geom.Buffers[j].Data[ePos], geom.Buffers[j].Data[ePos+1]);
}
ePos += eSize; ePos += eSize;
} }
} }
...@@ -1090,13 +1100,17 @@ void COgreMeshFileLoader::readPass(io::IReadFile* file, OgreTechnique& technique ...@@ -1090,13 +1100,17 @@ void COgreMeshFileLoader::readPass(io::IReadFile* file, OgreTechnique& technique
{ {
if (token=="texture") if (token=="texture")
{ {
getMaterialToken(file, pass.Texture.Filename); getMaterialToken(file, token);
pass.Texture.Filename.push_back(token);
#ifdef IRR_OGRE_LOADER_DEBUG #ifdef IRR_OGRE_LOADER_DEBUG
os::Printer::log("Read Texture", pass.Texture.Filename.c_str(), ELL_DEBUG); os::Printer::log("Read Texture", token, ELL_DEBUG);
#endif #endif
getMaterialToken(file, pass.Texture.CoordsType, true); getMaterialToken(file, pass.Texture.CoordsType, true);
getMaterialToken(file, pass.Texture.MipMaps, true); getMaterialToken(file, pass.Texture.MipMaps, true);
getMaterialToken(file, pass.Texture.Alpha, true); getMaterialToken(file, pass.Texture.Alpha, true);
// Hmm, we might need more hints for other material types using two textures...
if (textureUnit>0)
pass.Material.MaterialType=video::EMT_LIGHTMAP;
} }
else if (token=="filtering") else if (token=="filtering")
{ {
......
...@@ -81,9 +81,7 @@ private: ...@@ -81,9 +81,7 @@ private:
struct OgreTexture struct OgreTexture
{ {
OgreTexture() : Filename("") {} core::array<core::stringc> Filename;
core::stringc Filename;
core::stringc Alias; core::stringc Alias;
core::stringc CoordsType; core::stringc CoordsType;
core::stringc MipMaps; core::stringc MipMaps;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment