- fbx: fix crashbug when animating the root node.

pull/14/head
Alexander Gessler 2012-08-25 17:57:07 +02:00
parent 375c4b4242
commit 1dc2ea05fa
1 changed files with 24 additions and 3 deletions

View File

@ -87,6 +87,14 @@ const Object* LazyObject::Get(bool dieOnError)
return object.get();
}
// if this is the root object, we return a dummy since there
// is no root object int he fbx file - it is just referenced
// with id 0.
if(id == 0L) {
object.reset(new Object(id, element, "Model::RootNode"));
return object.get();
}
const Token& key = element.KeyToken();
const TokenList& tokens = element.Tokens();
@ -331,6 +339,10 @@ void Document::ReadObjects()
DOMError("no Objects dictionary found");
}
// add a dummy entry to represent the Model::RootNode object (id 0),
// which is only indirectly defined in the input file
objects[0] = new LazyObject(0L, *eobjects, *this);
const Scope& sobjects = *eobjects->Compound();
BOOST_FOREACH(const ElementMap::value_type& el, sobjects.Elements()) {
@ -348,10 +360,19 @@ void Document::ReadObjects()
DOMError(err,el.second);
}
// id=0 is normally implicit
if(id == 0L) {
DOMError("encountered object with implicitly defined id 0",el.second);
}
if(objects.find(id) != objects.end()) {
DOMWarning("encountered duplicate object id, ignoring first occurrence",el.second);
}
objects[id] = new LazyObject(id, *el.second, *this);
// grab all animation stacks upfront since there is no listing of them
if(el.first == "AnimationStack") {
if(!strcmp(el.first.c_str(),"AnimationStack")) {
animationStacks.push_back(id);
}
}
@ -447,8 +468,8 @@ void Document::ReadConnections()
continue;
}
// dest may be 0 (root node)
if(dest && objects.find(dest) == objects.end()) {
// dest may be 0 (root node) but we added a dummy object before
if(objects.find(dest) == objects.end()) {
DOMWarning("destination object for connection does not exist",&el);
continue;
}