Handle non-node roots more gracefully (bug #5416)

pull/578/head
Capostrophic 5 years ago
parent 74bf8ef807
commit 915ffe2241

@ -13,6 +13,7 @@
Bug #5369: Spawnpoint in the Grazelands doesn't produce oversized creatures Bug #5369: Spawnpoint in the Grazelands doesn't produce oversized creatures
Bug #5370: Opening an unlocked but trapped door uses the key Bug #5370: Opening an unlocked but trapped door uses the key
Bug #5400: Editor: Verifier checks race of non-skin bodyparts Bug #5400: Editor: Verifier checks race of non-skin bodyparts
Bug #5416: Junk non-node records before the root node are not handled gracefully
Feature #5362: Show the soul gems' trapped soul in count dialog Feature #5362: Show the soul gems' trapped soul in count dialog
0.46.0 0.46.0

@ -132,20 +132,17 @@ osg::ref_ptr<Resource::BulletShape> BulletNifLoader::load(const Nif::File& nif)
mStaticMesh.reset(); mStaticMesh.reset();
mAvoidStaticMesh.reset(); mAvoidStaticMesh.reset();
if (nif.numRoots() < 1) Nif::Node* node;
for (size_t i = 0; i < nif.numRoots(); ++i)
{ {
warn("Found no root nodes in NIF."); Nif::Record* r = nif.getRoot(i);
return mShape;
}
Nif::Record *r = nif.getRoot(0);
assert(r != nullptr); assert(r != nullptr);
if ((node = dynamic_cast<Nif::Node*>(r)))
Nif::Node *node = dynamic_cast<Nif::Node*>(r); break;
if (node == nullptr) }
if (!node)
{ {
warn("First root in file was not a node, but a " + warn("Found no root nodes in NIF.");
r->recName + ". Skipping file.");
return mShape; return mShape;
} }

@ -247,22 +247,23 @@ namespace NifOsg
static void loadKf(Nif::NIFFilePtr nif, KeyframeHolder& target) static void loadKf(Nif::NIFFilePtr nif, KeyframeHolder& target)
{ {
if(nif->numRoots() < 1) const Nif::NiSequenceStreamHelper *seq;
for (size_t i = 0; i < nif->numRoots(); ++i)
{ {
nif->warn("Found no root nodes"); const Nif::Record *r = nif->getRoot(i);
return;
}
const Nif::Record *r = nif->getRoot(0);
assert(r != nullptr); assert(r != nullptr);
if (r->recType == Nif::RC_NiSequenceStreamHelper)
{
seq = static_cast<const Nif::NiSequenceStreamHelper*>(r);
break;
}
}
if(r->recType != Nif::RC_NiSequenceStreamHelper) if (!seq)
{ {
nif->warn("First root was not a NiSequenceStreamHelper, but a "+ nif->warn("Found no NiSequenceStreamHelper root record");
r->recName+".");
return; return;
} }
const Nif::NiSequenceStreamHelper *seq = static_cast<const Nif::NiSequenceStreamHelper*>(r);
Nif::ExtraPtr extra = seq->extra; Nif::ExtraPtr extra = seq->extra;
if(extra.empty() || extra->recType != Nif::RC_NiTextKeyExtraData) if(extra.empty() || extra->recType != Nif::RC_NiTextKeyExtraData)
@ -303,15 +304,16 @@ namespace NifOsg
osg::ref_ptr<osg::Node> load(Nif::NIFFilePtr nif, Resource::ImageManager* imageManager) osg::ref_ptr<osg::Node> load(Nif::NIFFilePtr nif, Resource::ImageManager* imageManager)
{ {
if (nif->numRoots() < 1) const Nif::Node* nifNode;
for (size_t i = 0; i < nif->numRoots(); ++i)
{
const Nif::Record* r = nif->getRoot(i);
if ((nifNode = dynamic_cast<const Nif::Node*>(r)))
break;
}
if (!nifNode)
nif->fail("Found no root nodes"); nif->fail("Found no root nodes");
const Nif::Record* r = nif->getRoot(0);
const Nif::Node* nifNode = dynamic_cast<const Nif::Node*>(r);
if (nifNode == nullptr)
nif->fail("First root was not a node, but a " + r->recName);
osg::ref_ptr<TextKeyMapHolder> textkeys (new TextKeyMapHolder); osg::ref_ptr<TextKeyMapHolder> textkeys (new TextKeyMapHolder);
osg::ref_ptr<osg::Node> created = handleNode(nifNode, nullptr, imageManager, std::vector<unsigned int>(), 0, false, false, false, &textkeys->mTextKeys); osg::ref_ptr<osg::Node> created = handleNode(nifNode, nullptr, imageManager, std::vector<unsigned int>(), 0, false, false, false, &textkeys->mTextKeys);

Loading…
Cancel
Save