Commit a5d73cd0 authored by hybrid's avatar hybrid

Fixed Ogre index interpretation (reported by Zhu) and fixed material loading.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1746 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 75ee82d7
...@@ -14,6 +14,10 @@ ...@@ -14,6 +14,10 @@
#include "fast_atof.h" #include "fast_atof.h"
#include "coreutil.h" #include "coreutil.h"
#ifdef _DEBUG
#define IRR_OGRE_LOADER_DEBUG
#endif
namespace irr namespace irr
{ {
namespace scene namespace scene
...@@ -167,6 +171,9 @@ bool COgreMeshFileLoader::readChunk(io::IReadFile* file) ...@@ -167,6 +171,9 @@ bool COgreMeshFileLoader::readChunk(io::IReadFile* file)
bool COgreMeshFileLoader::readObjectChunk(io::IReadFile* file, ChunkData& parent, OgreMesh& mesh) bool COgreMeshFileLoader::readObjectChunk(io::IReadFile* file, ChunkData& parent, OgreMesh& mesh)
{ {
#ifdef IRR_OGRE_LOADER_DEBUG
os::Printer::log("Read Object Chunk");
#endif
readBool(file, parent, mesh.SkeletalAnimation); readBool(file, parent, mesh.SkeletalAnimation);
while ((parent.read < parent.header.length)&&(file->getPos() < file->getSize())) while ((parent.read < parent.header.length)&&(file->getPos() < file->getSize()))
{ {
...@@ -213,6 +220,9 @@ bool COgreMeshFileLoader::readObjectChunk(io::IReadFile* file, ChunkData& parent ...@@ -213,6 +220,9 @@ bool COgreMeshFileLoader::readObjectChunk(io::IReadFile* file, ChunkData& parent
bool COgreMeshFileLoader::readGeometry(io::IReadFile* file, ChunkData& parent, OgreGeometry& geometry) bool COgreMeshFileLoader::readGeometry(io::IReadFile* file, ChunkData& parent, OgreGeometry& geometry)
{ {
#ifdef IRR_OGRE_LOADER_DEBUG
os::Printer::log("Read Geometry");
#endif
readInt(file, parent, geometry.NumVertex); readInt(file, parent, geometry.NumVertex);
while(parent.read < parent.header.length) while(parent.read < parent.header.length)
{ {
...@@ -240,6 +250,9 @@ bool COgreMeshFileLoader::readGeometry(io::IReadFile* file, ChunkData& parent, O ...@@ -240,6 +250,9 @@ bool COgreMeshFileLoader::readGeometry(io::IReadFile* file, ChunkData& parent, O
bool COgreMeshFileLoader::readVertexDeclaration(io::IReadFile* file, ChunkData& parent, OgreGeometry& geometry) bool COgreMeshFileLoader::readVertexDeclaration(io::IReadFile* file, ChunkData& parent, OgreGeometry& geometry)
{ {
#ifdef IRR_OGRE_LOADER_DEBUG
os::Printer::log("Read Vertex Declaration");
#endif
NumUV = 0; NumUV = 0;
while(parent.read < parent.header.length) while(parent.read < parent.header.length)
{ {
...@@ -277,6 +290,9 @@ bool COgreMeshFileLoader::readVertexDeclaration(io::IReadFile* file, ChunkData& ...@@ -277,6 +290,9 @@ bool COgreMeshFileLoader::readVertexDeclaration(io::IReadFile* file, ChunkData&
bool COgreMeshFileLoader::readVertexBuffer(io::IReadFile* file, ChunkData& parent, OgreGeometry& geometry) bool COgreMeshFileLoader::readVertexBuffer(io::IReadFile* file, ChunkData& parent, OgreGeometry& geometry)
{ {
#ifdef IRR_OGRE_LOADER_DEBUG
os::Printer::log("Read Vertex Buffer");
#endif
OgreVertexBuffer buf; OgreVertexBuffer buf;
readShort(file, parent, buf.BindIndex); readShort(file, parent, buf.BindIndex);
readShort(file, parent, buf.VertexSize); readShort(file, parent, buf.VertexSize);
...@@ -299,6 +315,9 @@ bool COgreMeshFileLoader::readVertexBuffer(io::IReadFile* file, ChunkData& paren ...@@ -299,6 +315,9 @@ bool COgreMeshFileLoader::readVertexBuffer(io::IReadFile* file, ChunkData& paren
bool COgreMeshFileLoader::readSubMesh(io::IReadFile* file, ChunkData& parent, OgreSubMesh& subMesh) bool COgreMeshFileLoader::readSubMesh(io::IReadFile* file, ChunkData& parent, OgreSubMesh& subMesh)
{ {
#ifdef IRR_OGRE_LOADER_DEBUG
os::Printer::log("Read Submesh");
#endif
readString(file, parent, subMesh.Material); readString(file, parent, subMesh.Material);
readBool(file, parent, subMesh.SharedVertices); readBool(file, parent, subMesh.SharedVertices);
...@@ -365,7 +384,6 @@ bool COgreMeshFileLoader::readSubMesh(io::IReadFile* file, ChunkData& parent, Og ...@@ -365,7 +384,6 @@ bool COgreMeshFileLoader::readSubMesh(io::IReadFile* file, ChunkData& parent, Og
} }
void COgreMeshFileLoader::composeMeshBufferMaterial(scene::IMeshBuffer* mb, const core::stringc& materialName) void COgreMeshFileLoader::composeMeshBufferMaterial(scene::IMeshBuffer* mb, const core::stringc& materialName)
{ {
video::SMaterial& material=mb->getMaterial(); video::SMaterial& material=mb->getMaterial();
...@@ -396,7 +414,6 @@ void COgreMeshFileLoader::composeMeshBufferMaterial(scene::IMeshBuffer* mb, cons ...@@ -396,7 +414,6 @@ void COgreMeshFileLoader::composeMeshBufferMaterial(scene::IMeshBuffer* mb, cons
} }
scene::SMeshBuffer* COgreMeshFileLoader::composeMeshBuffer(const core::array<s32>& indices, const OgreGeometry& geom) scene::SMeshBuffer* COgreMeshFileLoader::composeMeshBuffer(const core::array<s32>& indices, const OgreGeometry& geom)
{ {
scene::SMeshBuffer *mb=new scene::SMeshBuffer(); scene::SMeshBuffer *mb=new scene::SMeshBuffer();
...@@ -413,7 +430,7 @@ scene::SMeshBuffer* COgreMeshFileLoader::composeMeshBuffer(const core::array<s32 ...@@ -413,7 +430,7 @@ scene::SMeshBuffer* COgreMeshFileLoader::composeMeshBuffer(const core::array<s32
{ {
for (u32 j=0; j<geom.Buffers.size(); ++j) for (u32 j=0; j<geom.Buffers.size(); ++j)
{ {
if (geom.Elements[i].Index==geom.Buffers[j].BindIndex) if (geom.Elements[i].Source==geom.Buffers[j].BindIndex)
{ {
u32 eSize=geom.Buffers[j].VertexSize; u32 eSize=geom.Buffers[j].VertexSize;
u32 ePos=geom.Elements[i].Offset; u32 ePos=geom.Elements[i].Offset;
...@@ -431,7 +448,7 @@ scene::SMeshBuffer* COgreMeshFileLoader::composeMeshBuffer(const core::array<s32 ...@@ -431,7 +448,7 @@ scene::SMeshBuffer* COgreMeshFileLoader::composeMeshBuffer(const core::array<s32
{ {
for (u32 j=0; j<geom.Buffers.size(); ++j) for (u32 j=0; j<geom.Buffers.size(); ++j)
{ {
if (geom.Elements[i].Index==geom.Buffers[j].BindIndex) if (geom.Elements[i].Source==geom.Buffers[j].BindIndex)
{ {
u32 eSize=geom.Buffers[j].VertexSize; u32 eSize=geom.Buffers[j].VertexSize;
u32 ePos=geom.Elements[i].Offset; u32 ePos=geom.Elements[i].Offset;
...@@ -448,7 +465,7 @@ scene::SMeshBuffer* COgreMeshFileLoader::composeMeshBuffer(const core::array<s32 ...@@ -448,7 +465,7 @@ scene::SMeshBuffer* COgreMeshFileLoader::composeMeshBuffer(const core::array<s32
{ {
for (u32 j=0; j<geom.Buffers.size(); ++j) for (u32 j=0; j<geom.Buffers.size(); ++j)
{ {
if (geom.Elements[i].Index==geom.Buffers[j].BindIndex) if (geom.Elements[i].Source==geom.Buffers[j].BindIndex)
{ {
u32 eSize=geom.Buffers[j].VertexSize; u32 eSize=geom.Buffers[j].VertexSize;
u32 ePos=geom.Elements[i].Offset; u32 ePos=geom.Elements[i].Offset;
...@@ -465,7 +482,6 @@ scene::SMeshBuffer* COgreMeshFileLoader::composeMeshBuffer(const core::array<s32 ...@@ -465,7 +482,6 @@ scene::SMeshBuffer* COgreMeshFileLoader::composeMeshBuffer(const core::array<s32
} }
scene::SMeshBufferLightMap* COgreMeshFileLoader::composeMeshBufferLightMap(const core::array<s32>& indices, const OgreGeometry& geom) scene::SMeshBufferLightMap* COgreMeshFileLoader::composeMeshBufferLightMap(const core::array<s32>& indices, const OgreGeometry& geom)
{ {
scene::SMeshBufferLightMap *mb=new scene::SMeshBufferLightMap(); scene::SMeshBufferLightMap *mb=new scene::SMeshBufferLightMap();
...@@ -483,7 +499,7 @@ scene::SMeshBufferLightMap* COgreMeshFileLoader::composeMeshBufferLightMap(const ...@@ -483,7 +499,7 @@ scene::SMeshBufferLightMap* COgreMeshFileLoader::composeMeshBufferLightMap(const
{ {
for (u32 j=0; j<geom.Buffers.size(); ++j) for (u32 j=0; j<geom.Buffers.size(); ++j)
{ {
if (geom.Elements[i].Index==geom.Buffers[j].BindIndex) if (geom.Elements[i].Source==geom.Buffers[j].BindIndex)
{ {
u32 eSize=geom.Buffers[j].VertexSize; u32 eSize=geom.Buffers[j].VertexSize;
u32 ePos=geom.Elements[i].Offset; u32 ePos=geom.Elements[i].Offset;
...@@ -501,7 +517,7 @@ scene::SMeshBufferLightMap* COgreMeshFileLoader::composeMeshBufferLightMap(const ...@@ -501,7 +517,7 @@ scene::SMeshBufferLightMap* COgreMeshFileLoader::composeMeshBufferLightMap(const
{ {
for (u32 j=0; j<geom.Buffers.size(); ++j) for (u32 j=0; j<geom.Buffers.size(); ++j)
{ {
if (geom.Elements[i].Index==geom.Buffers[j].BindIndex) if (geom.Elements[i].Source==geom.Buffers[j].BindIndex)
{ {
u32 eSize=geom.Buffers[j].VertexSize; u32 eSize=geom.Buffers[j].VertexSize;
u32 ePos=geom.Elements[i].Offset; u32 ePos=geom.Elements[i].Offset;
...@@ -518,7 +534,7 @@ scene::SMeshBufferLightMap* COgreMeshFileLoader::composeMeshBufferLightMap(const ...@@ -518,7 +534,7 @@ scene::SMeshBufferLightMap* COgreMeshFileLoader::composeMeshBufferLightMap(const
{ {
for (u32 j=0; j<geom.Buffers.size(); ++j) for (u32 j=0; j<geom.Buffers.size(); ++j)
{ {
if (geom.Elements[i].Index==geom.Buffers[j].BindIndex) if (geom.Elements[i].Source==geom.Buffers[j].BindIndex)
{ {
u32 eSize=geom.Buffers[j].VertexSize; u32 eSize=geom.Buffers[j].VertexSize;
u32 ePos=geom.Elements[i].Offset; u32 ePos=geom.Elements[i].Offset;
...@@ -538,7 +554,6 @@ scene::SMeshBufferLightMap* COgreMeshFileLoader::composeMeshBufferLightMap(const ...@@ -538,7 +554,6 @@ scene::SMeshBufferLightMap* COgreMeshFileLoader::composeMeshBufferLightMap(const
} }
void COgreMeshFileLoader::composeObject(void) void COgreMeshFileLoader::composeObject(void)
{ {
for (u32 i=0; i<Meshes.size(); ++i) for (u32 i=0; i<Meshes.size(); ++i)
...@@ -600,6 +615,7 @@ core::stringc COgreMeshFileLoader::getTextureFileName(const core::stringc& textu ...@@ -600,6 +615,7 @@ core::stringc COgreMeshFileLoader::getTextureFileName(const core::stringc& textu
void COgreMeshFileLoader::getMaterialToken(io::IReadFile* file, core::stringc& token, bool noNewLine) void COgreMeshFileLoader::getMaterialToken(io::IReadFile* file, core::stringc& token, bool noNewLine)
{ {
bool parseString=false;
c8 c=0; c8 c=0;
token = ""; token = "";
...@@ -613,12 +629,17 @@ void COgreMeshFileLoader::getMaterialToken(io::IReadFile* file, core::stringc& t ...@@ -613,12 +629,17 @@ void COgreMeshFileLoader::getMaterialToken(io::IReadFile* file, core::stringc& t
} }
file->read(&c, sizeof(c8)); file->read(&c, sizeof(c8));
} }
if (c=='"')
{
parseString = true;
file->read(&c, sizeof(c8));
}
do do
{ {
if (c=='/') if (c=='/')
{ {
file->read(&c, sizeof(c8)); file->read(&c, sizeof(c8));
if (c=='/') if (!parseString && (c=='/'))
{ // skip comments { // skip comments
while(c!='\n') while(c!='\n')
file->read(&c, sizeof(c8)); file->read(&c, sizeof(c8));
...@@ -626,20 +647,21 @@ void COgreMeshFileLoader::getMaterialToken(io::IReadFile* file, core::stringc& t ...@@ -626,20 +647,21 @@ void COgreMeshFileLoader::getMaterialToken(io::IReadFile* file, core::stringc& t
else else
{ {
token.append('/'); token.append('/');
if (core::isspace(c)) if ((!parseString && core::isspace(c)) ||
(parseString && (c=='"')))
return; return;
} }
} }
token.append(c); token.append(c);
file->read(&c, sizeof(c8)); file->read(&c, sizeof(c8));
} }
while ((!core::isspace(c)) && (file->getPos() < file->getSize())); while (((!parseString && !core::isspace(c)) || (parseString && (c!='"'))) &&
if (c == '\n' && noNewLine) (file->getPos() < file->getSize()));
if (!parseString)
file->seek(-1, true); file->seek(-1, true);
} }
bool COgreMeshFileLoader::readColor(io::IReadFile* file, video::SColor& col) bool COgreMeshFileLoader::readColor(io::IReadFile* file, video::SColor& col)
{ {
core::stringc token; core::stringc token;
...@@ -670,6 +692,9 @@ bool COgreMeshFileLoader::readColor(io::IReadFile* file, video::SColor& col) ...@@ -670,6 +692,9 @@ bool COgreMeshFileLoader::readColor(io::IReadFile* file, video::SColor& col)
void COgreMeshFileLoader::readPass(io::IReadFile* file, OgreTechnique& technique) void COgreMeshFileLoader::readPass(io::IReadFile* file, OgreTechnique& technique)
{ {
#ifdef IRR_OGRE_LOADER_DEBUG
os::Printer::log("Read Pass");
#endif
core::stringc token; core::stringc token;
technique.Passes.push_back(OgrePass()); technique.Passes.push_back(OgrePass());
OgrePass& pass=technique.Passes.getLast(); OgrePass& pass=technique.Passes.getLast();
...@@ -829,9 +854,11 @@ void COgreMeshFileLoader::readPass(io::IReadFile* file, OgreTechnique& technique ...@@ -829,9 +854,11 @@ void COgreMeshFileLoader::readPass(io::IReadFile* file, OgreTechnique& technique
} }
void COgreMeshFileLoader::readTechnique(io::IReadFile* file, OgreMaterial& mat) void COgreMeshFileLoader::readTechnique(io::IReadFile* file, OgreMaterial& mat)
{ {
#ifdef IRR_OGRE_LOADER_DEBUG
os::Printer::log("Read Technique");
#endif
core::stringc token; core::stringc token;
mat.Techniques.push_back(OgreTechnique()); mat.Techniques.push_back(OgreTechnique());
OgreTechnique& technique=mat.Techniques.getLast(); OgreTechnique& technique=mat.Techniques.getLast();
...@@ -859,6 +886,9 @@ void COgreMeshFileLoader::readTechnique(io::IReadFile* file, OgreMaterial& mat) ...@@ -859,6 +886,9 @@ void COgreMeshFileLoader::readTechnique(io::IReadFile* file, OgreMaterial& mat)
void COgreMeshFileLoader::loadMaterials(io::IReadFile* meshFile) void COgreMeshFileLoader::loadMaterials(io::IReadFile* meshFile)
{ {
#ifdef IRR_OGRE_LOADER_DEBUG
os::Printer::log("Load Materials");
#endif
core::stringc token,filename=meshFile->getFileName(); core::stringc token,filename=meshFile->getFileName();
core::stringc material = filename.subString(0, filename.size()-4) + "material"; core::stringc material = filename.subString(0, filename.size()-4) + "material";
io::IReadFile* file = FileSystem->createAndOpenFile(material.c_str()); io::IReadFile* file = FileSystem->createAndOpenFile(material.c_str());
...@@ -876,9 +906,20 @@ void COgreMeshFileLoader::loadMaterials(io::IReadFile* meshFile) ...@@ -876,9 +906,20 @@ void COgreMeshFileLoader::loadMaterials(io::IReadFile* meshFile)
Materials.push_back(OgreMaterial()); Materials.push_back(OgreMaterial());
OgreMaterial& mat = Materials.getLast(); OgreMaterial& mat = Materials.getLast();
if (token == "fragment_program")
{
do
{
getMaterialToken(file, token);
} while (token != "}");
getMaterialToken(file, token);
}
if (token != "material") if (token != "material")
return; return;
getMaterialToken(file, mat.Name); getMaterialToken(file, mat.Name);
#ifdef IRR_OGRE_LOADER_DEBUG
os::Printer::log("Load Material", mat.Name.c_str());
#endif
getMaterialToken(file, token); //open brace getMaterialToken(file, token); //open brace
getMaterialToken(file, token); getMaterialToken(file, token);
while(token != "}") while(token != "}")
......
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