* Fix bug in loading of 3.3.5 M2 files

This commit is contained in:
Shlainn 2011-11-23 14:32:34 +01:00
parent 73efbaf339
commit e960db4cd8

View File

@ -303,7 +303,7 @@ for(u32 i=0; i<M2MAnimations.size(); i++)
} }
for(u32 j=0; j<M2MBones.size(); j++) for(u32 j=0; j<M2MBones.size(); j++)
{ {
if(M2MBones[j].translation.header.TimeStamp.num>0 && M2MBones[j].translation.header.Values.num>0) if(M2MBones[j].translation.header.TimeStamp.num>i && M2MBones[j].translation.header.Values.num>i)
{ {
//Timestamps //Timestamps
MeshFile->seek(M2MBones[j].translation.header.TimeStamp.ofs+8*i); MeshFile->seek(M2MBones[j].translation.header.TimeStamp.ofs+8*i);
@ -330,7 +330,7 @@ for(u32 i=0; i<M2MAnimations.size(); i++)
} }
} }
} }
if(M2MBones[j].rotation.header.TimeStamp.num>0 && M2MBones[j].rotation.header.Values.num>0) if(M2MBones[j].rotation.header.TimeStamp.num>i && M2MBones[j].rotation.header.Values.num>i)
{ {
//Timestamps //Timestamps
MeshFile->seek(M2MBones[j].rotation.header.TimeStamp.ofs+8*i); MeshFile->seek(M2MBones[j].rotation.header.TimeStamp.ofs+8*i);
@ -358,7 +358,7 @@ for(u32 i=0; i<M2MAnimations.size(); i++)
} }
} }
} }
if(M2MBones[j].scaling.header.TimeStamp.num>0 && M2MBones[j].scaling.header.Values.num>0) if(M2MBones[j].scaling.header.TimeStamp.num>i && M2MBones[j].scaling.header.Values.num>i)
{ {
//Timestamps //Timestamps
MeshFile->seek(M2MBones[j].scaling.header.TimeStamp.ofs+8*i); MeshFile->seek(M2MBones[j].scaling.header.TimeStamp.ofs+8*i);
@ -400,50 +400,50 @@ DEBUG(logdebug("Read %u Bones",M2MBones.size()));
void CM2MeshFileLoader::ReadAnimationData() void CM2MeshFileLoader::ReadAnimationData()
{ {
//Global Sequences. This is global data // //Global Sequences. This is global data
u32 tempGlobalSeq; // u32 tempGlobalSeq;
if(!M2MGlobalSequences.empty()) // if(!M2MGlobalSequences.empty())
{ // {
M2MGlobalSequences.clear(); // M2MGlobalSequences.clear();
} // }
MeshFile->seek(header.GlobalSequences.ofs); // MeshFile->seek(header.GlobalSequences.ofs);
for(u32 i=0;i<header.GlobalSequences.num;i++) // for(u32 i=0;i<header.GlobalSequences.num;i++)
{ // {
MeshFile->read(&tempGlobalSeq,sizeof(u32)); // MeshFile->read(&tempGlobalSeq,sizeof(u32));
M2MGlobalSequences.push_back(tempGlobalSeq); // M2MGlobalSequences.push_back(tempGlobalSeq);
DEBUG(logdebug("Global Sequence %u End %u",i,tempGlobalSeq)); // DEBUG(logdebug("Global Sequence %u End %u",i,tempGlobalSeq));
} // }
DEBUG(logdebug("Read %u Global Sequence entries",M2MGlobalSequences.size())); // DEBUG(logdebug("Read %u Global Sequence entries",M2MGlobalSequences.size()));
//
//BoneLookupTable. This is global data // //BoneLookupTable. This is global data
u16 tempBoneLookup; // u16 tempBoneLookup;
if(!M2MBoneLookupTable.empty()) // if(!M2MBoneLookupTable.empty())
{ // {
M2MBoneLookupTable.clear(); // M2MBoneLookupTable.clear();
} // }
MeshFile->seek(header.BoneLookupTable.ofs); // MeshFile->seek(header.BoneLookupTable.ofs);
for(u32 i=0;i<header.BoneLookupTable.num;i++) // for(u32 i=0;i<header.BoneLookupTable.num;i++)
{ // {
MeshFile->read(&tempBoneLookup,sizeof(u16)); // MeshFile->read(&tempBoneLookup,sizeof(u16));
M2MBoneLookupTable.push_back(tempBoneLookup); // M2MBoneLookupTable.push_back(tempBoneLookup);
DEBUG(logdebug("BoneLookupTable %u Value %u",i,tempBoneLookup)); // DEBUG(logdebug("BoneLookupTable %u Value %u",i,tempBoneLookup));
} // }
DEBUG(logdebug("Read %u BoneLookupTable entries",M2MBoneLookupTable.size())); // DEBUG(logdebug("Read %u BoneLookupTable entries",M2MBoneLookupTable.size()));
//
//SkeleBoneLookupTable. This is global data // //SkeleBoneLookupTable. This is global data
u16 tempSkeleBoneLookup; // u16 tempSkeleBoneLookup;
if(!M2MSkeleBoneLookupTable.empty()) // if(!M2MSkeleBoneLookupTable.empty())
{ // {
M2MSkeleBoneLookupTable.clear(); // M2MSkeleBoneLookupTable.clear();
} // }
MeshFile->seek(header.SkelBoneLookup.ofs); // MeshFile->seek(header.SkelBoneLookup.ofs);
for(u32 i=0;i<header.SkelBoneLookup.num;i++) // for(u32 i=0;i<header.SkelBoneLookup.num;i++)
{ // {
MeshFile->read(&tempSkeleBoneLookup,sizeof(u16)); // MeshFile->read(&tempSkeleBoneLookup,sizeof(u16));
M2MSkeleBoneLookupTable.push_back(tempSkeleBoneLookup); // M2MSkeleBoneLookupTable.push_back(tempSkeleBoneLookup);
DEBUG(logdebug("SkeleBoneLookupTable %u Value %u",i,tempSkeleBoneLookup)); // DEBUG(logdebug("SkeleBoneLookupTable %u Value %u",i,tempSkeleBoneLookup));
} // }
DEBUG(logdebug("Read %u SkeleBoneLookupTable entries",M2MSkeleBoneLookupTable.size())); // DEBUG(logdebug("Read %u SkeleBoneLookupTable entries",M2MSkeleBoneLookupTable.size()));
//Animations. This is global data //Animations. This is global data
u32 laststart = 0; u32 laststart = 0;
@ -481,20 +481,20 @@ void CM2MeshFileLoader::ReadAnimationData()
DEBUG(logdebug("Animation %u Id %u Start %u End %u",i,tempAnimation.animationID,tempAnimation.start,tempAnimation.end)); DEBUG(logdebug("Animation %u Id %u Start %u End %u",i,tempAnimation.animationID,tempAnimation.start,tempAnimation.end));
} }
DEBUG(logdebug("Read %u Animations",M2MAnimations.size())); DEBUG(logdebug("Read %u Animations",M2MAnimations.size()));
//Animation Lookup. This is global data // //Animation Lookup. This is global data
s16 tempAniLookup; // s16 tempAniLookup;
if(!M2MAnimationLookup.empty()) // if(!M2MAnimationLookup.empty())
{ // {
M2MAnimationLookup.clear(); // M2MAnimationLookup.clear();
} // }
MeshFile->seek(header.AnimationLookup.ofs); // MeshFile->seek(header.AnimationLookup.ofs);
for(u32 i=0;i<header.AnimationLookup.num;i++) // for(u32 i=0;i<header.AnimationLookup.num;i++)
{ // {
MeshFile->read(&tempAniLookup,sizeof(s16)); // MeshFile->read(&tempAniLookup,sizeof(s16));
M2MAnimationLookup.push_back(tempAniLookup); // M2MAnimationLookup.push_back(tempAniLookup);
DEBUG(logdebug("Animation Lookup %u Id %u",i,tempAniLookup)); // DEBUG(logdebug("Animation Lookup %u Id %u",i,tempAniLookup));
} // }
DEBUG(logdebug("Read %u AnimationLookup",M2MAnimationLookup.size())); // DEBUG(logdebug("Read %u AnimationLookup",M2MAnimationLookup.size()));
} }
void CM2MeshFileLoader::ReadTextureDefinitions() void CM2MeshFileLoader::ReadTextureDefinitions()