Use a multimap to store the text keys

actorid
Chris Robinson 12 years ago
parent 9b491edbf8
commit cd8515396a

@ -49,44 +49,27 @@ bool Animation::findGroupTimes(const std::string &groupname, Animation::GroupTim
std::string::const_iterator strpos = iter->second.begin(); std::string::const_iterator strpos = iter->second.begin();
std::string::const_iterator strend = iter->second.end(); std::string::const_iterator strend = iter->second.end();
size_t strlen = strend-strpos;
while(strpos != strend) if(start.size() <= strlen && std::mismatch(strpos, strend, start.begin(), checklow()).first == strend)
{ {
size_t strlen = strend-strpos; times->mStart = iter->first;
std::string::const_iterator striter; times->mLoopStart = iter->first;
}
if(start.size() <= strlen && else if(startloop.size() <= strlen && std::mismatch(strpos, strend, startloop.begin(), checklow()).first == strend)
((striter=std::mismatch(strpos, strend, start.begin(), checklow()).first) == strend || {
*striter == '\r' || *striter == '\n')) times->mLoopStart = iter->first;
{ }
times->mStart = iter->first; else if(stoploop.size() <= strlen && std::mismatch(strpos, strend, stoploop.begin(), checklow()).first == strend)
times->mLoopStart = iter->first; {
} times->mLoopStop = iter->first;
else if(startloop.size() <= strlen && }
((striter=std::mismatch(strpos, strend, startloop.begin(), checklow()).first) == strend || else if(stop.size() <= strlen && std::mismatch(strpos, strend, stop.begin(), checklow()).first == strend)
*striter == '\r' || *striter == '\n')) {
{ times->mStop = iter->first;
times->mLoopStart = iter->first; if(times->mLoopStop < 0.0f)
}
else if(stoploop.size() <= strlen &&
((striter=std::mismatch(strpos, strend, stoploop.begin(), checklow()).first) == strend ||
*striter == '\r' || *striter == '\n'))
{
times->mLoopStop = iter->first; times->mLoopStop = iter->first;
} break;
else if(stop.size() <= strlen &&
((striter=std::mismatch(strpos, strend, stop.begin(), checklow()).first) == strend ||
*striter == '\r' || *striter == '\n'))
{
times->mStop = iter->first;
if(times->mLoopStop < 0.0f)
times->mLoopStop = iter->first;
break;
}
strpos = std::find(strpos+1, strend, '\n');
while(strpos != strend && *strpos == '\n')
strpos++;
} }
} }

@ -152,6 +152,28 @@ static void fail(const std::string &msg)
} }
static void insertTextKeys(const Nif::NiTextKeyExtraData *tk, TextKeyMap *textkeys)
{
for(size_t i = 0;i < tk->list.size();i++)
{
const std::string &str = tk->list[i].text;
std::string::size_type pos = 0;
while(pos < str.length())
{
while(pos < str.length() && ::isspace(str[pos]))
pos++;
if(pos >= str.length())
break;
std::string::size_type nextpos = std::min(str.find('\r', pos), str.find('\n', pos));
textkeys->insert(std::make_pair(tk->list[i].time, str.substr(pos, nextpos-pos)));
pos = nextpos;
}
}
}
void buildBones(Ogre::Skeleton *skel, const Nif::Node *node, std::vector<Nif::NiKeyframeController*> &ctrls, Ogre::Bone *parent=NULL) void buildBones(Ogre::Skeleton *skel, const Nif::Node *node, std::vector<Nif::NiKeyframeController*> &ctrls, Ogre::Bone *parent=NULL)
{ {
Ogre::Bone *bone; Ogre::Bone *bone;
@ -359,8 +381,7 @@ bool createSkeleton(const std::string &name, const std::string &group, TextKeyMa
if(e->recType == Nif::RC_NiTextKeyExtraData) if(e->recType == Nif::RC_NiTextKeyExtraData)
{ {
const Nif::NiTextKeyExtraData *tk = static_cast<const Nif::NiTextKeyExtraData*>(e.getPtr()); const Nif::NiTextKeyExtraData *tk = static_cast<const Nif::NiTextKeyExtraData*>(e.getPtr());
for(size_t i = 0;i < tk->list.size();i++) insertTextKeys(tk, textkeys);
(*textkeys)[tk->list[i].time] = tk->list[i].text;
} }
e = e->extra; e = e->extra;
} }

@ -59,7 +59,7 @@ namespace NifOgre
{ {
// FIXME: These should not be in NifOgre, it works agnostic of what model format is used // FIXME: These should not be in NifOgre, it works agnostic of what model format is used
typedef std::map<float,std::string> TextKeyMap; typedef std::multimap<float,std::string> TextKeyMap;
struct EntityList { struct EntityList {
std::vector<Ogre::Entity*> mEntities; std::vector<Ogre::Entity*> mEntities;
Ogre::Entity *mSkelBase; Ogre::Entity *mSkelBase;

Loading…
Cancel
Save