Smd loads a single animation file

Can't load without mesh before
pull/2249/head
wxyu 2018-11-27 13:28:42 +08:00
parent ef8b61237d
commit ef151b4610
1 changed files with 6 additions and 22 deletions

View File

@ -81,7 +81,7 @@ SMDImporter::SMDImporter()
mBuffer(), mBuffer(),
pScene( nullptr ), pScene( nullptr ),
iFileSize( 0 ), iFileSize( 0 ),
iSmallestFrame( -1 ), iSmallestFrame( INT_MAX ),
dLengthOfAnim( 0.0 ), dLengthOfAnim( 0.0 ),
bHasUVs(false ), bHasUVs(false ),
iLineNumber(-1) { iLineNumber(-1) {
@ -141,7 +141,7 @@ void SMDImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS
mBuffer.resize( iFileSize + 1 ); mBuffer.resize( iFileSize + 1 );
TextFileToBuffer(file.get(), mBuffer ); TextFileToBuffer(file.get(), mBuffer );
iSmallestFrame = (1 << 31); iSmallestFrame = INT_MAX;
bHasUVs = true; bHasUVs = true;
iLineNumber = 1; iLineNumber = 1;
@ -499,7 +499,7 @@ void SMDImporter::CreateOutputNodes()
} }
// now add all bones as dummy sub nodes to the graph // now add all bones as dummy sub nodes to the graph
// AddBoneChildren(pScene->mRootNode,(uint32_t)-1); AddBoneChildren(pScene->mRootNode,(uint32_t)-1);
// if we have only one bone we can even remove the root node // if we have only one bone we can even remove the root node
if (pScene->mFlags & AI_SCENE_FLAGS_INCOMPLETE && if (pScene->mFlags & AI_SCENE_FLAGS_INCOMPLETE &&
@ -523,26 +523,12 @@ void SMDImporter::CreateOutputNodes()
// create output animations // create output animations
void SMDImporter::CreateOutputAnimations() void SMDImporter::CreateOutputAnimations()
{ {
unsigned int iNumBones = 0;
for (std::vector<SMD::Bone>::const_iterator
i = asBones.begin();
i != asBones.end();++i)
{
if ((*i).bIsUsed)++iNumBones;
}
if (!iNumBones)
{
// just make sure this case doesn't occur ... (it could occur
// if the file was invalid)
return;
}
pScene->mNumAnimations = 1; pScene->mNumAnimations = 1;
pScene->mAnimations = new aiAnimation*[1]; pScene->mAnimations = new aiAnimation*[1];
aiAnimation*& anim = pScene->mAnimations[0] = new aiAnimation(); aiAnimation*& anim = pScene->mAnimations[0] = new aiAnimation();
anim->mDuration = dLengthOfAnim; anim->mDuration = dLengthOfAnim;
anim->mNumChannels = iNumBones; anim->mNumChannels = asBones.size();
anim->mTicksPerSecond = 25.0; // FIXME: is this correct? anim->mTicksPerSecond = 25.0; // FIXME: is this correct?
aiNodeAnim** pp = anim->mChannels = new aiNodeAnim*[anim->mNumChannels]; aiNodeAnim** pp = anim->mChannels = new aiNodeAnim*[anim->mNumChannels];
@ -553,8 +539,6 @@ void SMDImporter::CreateOutputAnimations()
i = asBones.begin(); i = asBones.begin();
i != asBones.end();++i) i != asBones.end();++i)
{ {
if (!(*i).bIsUsed)continue;
aiNodeAnim* p = pp[a] = new aiNodeAnim(); aiNodeAnim* p = pp[a] = new aiNodeAnim();
// copy the name of the bone // copy the name of the bone
@ -865,7 +849,6 @@ void SMDImporter::ParseSkeletonSection(const char* szCurrent,
// "time <n>\n" - Specifies the current animation frame // "time <n>\n" - Specifies the current animation frame
else if (TokenMatch(szCurrent,"time",4)) else if (TokenMatch(szCurrent,"time",4))
{ {
// NOTE: The doc says that time values COULD be negative ...
if(!ParseSignedInt(szCurrent,&szCurrent,iTime))break; if(!ParseSignedInt(szCurrent,&szCurrent,iTime))break;
iSmallestFrame = std::min(iSmallestFrame,iTime); iSmallestFrame = std::min(iSmallestFrame,iTime);
@ -1006,7 +989,8 @@ void SMDImporter::ParseSkeletonElement(const char* szCurrent,
mTemp.c4 = vPos.z; mTemp.c4 = vPos.z;
key.matrix = key.matrix * mTemp; key.matrix = key.matrix * mTemp;
} }
key.vPos = vPos;
key.vRot = vRot;
// go to the beginning of the next line // go to the beginning of the next line
SMDI_PARSE_RETURN; SMDI_PARSE_RETURN;
} }