Revert "Handle RootCollisionNode, attached to non-root node (bug #4311)"

This reverts commit ec9a1b0d05.
pull/541/head
Andrei Kortunov 6 years ago
parent 0fad2449f3
commit 6d91fe69b2

@ -57,7 +57,6 @@
Bug #4293: Faction members are not aware of faction ownerships in barter Bug #4293: Faction members are not aware of faction ownerships in barter
Bug #4304: "Follow" not working as a second AI package Bug #4304: "Follow" not working as a second AI package
Bug #4307: World cleanup should remove dead bodies only if death animation is finished Bug #4307: World cleanup should remove dead bodies only if death animation is finished
Bug #4311: OpenMW does not handle RootCollisionNode correctly
Bug #4327: Missing animations during spell/weapon stance switching Bug #4327: Missing animations during spell/weapon stance switching
Bug #4333: Keyboard navigation in containers is not intuitive Bug #4333: Keyboard navigation in containers is not intuitive
Bug #4358: Running animation is interrupted when magic mode is toggled Bug #4358: Running animation is interrupted when magic mode is toggled

@ -96,17 +96,14 @@ osg::ref_ptr<Resource::BulletShape> BulletNifLoader::load(const Nif::File& nif)
} }
else else
{ {
bool autogenerated = hasAutoGeneratedCollision(node);
// files with the name convention xmodel.nif usually have keyframes stored in a separate file xmodel.kf (see Animation::addAnimSource). // files with the name convention xmodel.nif usually have keyframes stored in a separate file xmodel.kf (see Animation::addAnimSource).
// assume all nodes in the file will be animated // assume all nodes in the file will be animated
const auto filename = nif.getFilename(); const auto filename = nif.getFilename();
const bool isAnimated = pathFileNameStartsWithX(filename); const bool isAnimated = pathFileNameStartsWithX(filename);
// If the mesh has RootCollisionNode, attached to actual root node, use it as collision mesh handleNode(node, 0, autogenerated, isAnimated, autogenerated);
const Nif::Node* rootCollisionNode = getCollisionNode(node);
if (rootCollisionNode)
handleNode(filename, rootCollisionNode, 0, false, isAnimated, false);
else
handleNode(filename, node, 0, true, isAnimated, true);
if (mCompoundShape) if (mCompoundShape)
{ {
@ -163,34 +160,25 @@ bool BulletNifLoader::findBoundingBox(const Nif::Node* node, int flags)
return false; return false;
} }
const Nif::Node* BulletNifLoader::getCollisionNode(const Nif::Node* rootNode) bool BulletNifLoader::hasAutoGeneratedCollision(const Nif::Node* rootNode)
{ {
const Nif::NiNode *ninode = dynamic_cast<const Nif::NiNode*>(rootNode); const Nif::NiNode *ninode = dynamic_cast<const Nif::NiNode*>(rootNode);
if(ninode) if(ninode)
{ {
// If root NiNode has only other NiNode as child, consider it as a wrapper, not as actual root node
const Nif::NodeList &list = ninode->children; const Nif::NodeList &list = ninode->children;
if (list.length() == 1 && for(size_t i = 0;i < list.length();i++)
rootNode->recType == Nif::RC_NiNode &&
list[0].getPtr()->recType == Nif::RC_NiNode)
{
return getCollisionNode(list[0].getPtr());
}
for(size_t i = 0; i < list.length(); i++)
{ {
if(list[i].empty()) if(!list[i].empty())
continue; {
if(list[i].getPtr()->recType == Nif::RC_RootCollisionNode)
const Nif::Node* childNode = list[i].getPtr(); return false;
if(childNode->recType == Nif::RC_RootCollisionNode) }
return childNode;
} }
} }
return nullptr; return true;
} }
void BulletNifLoader::handleNode(const std::string& fileName, const Nif::Node *node, int flags, void BulletNifLoader::handleNode(const Nif::Node *node, int flags,
bool isCollisionNode, bool isAnimated, bool autogenerated) bool isCollisionNode, bool isAnimated, bool autogenerated)
{ {
// Accumulate the flags from all the child nodes. This works for all // Accumulate the flags from all the child nodes. This works for all
@ -203,9 +191,6 @@ void BulletNifLoader::handleNode(const std::string& fileName, const Nif::Node *n
isCollisionNode = isCollisionNode || (node->recType == Nif::RC_RootCollisionNode); isCollisionNode = isCollisionNode || (node->recType == Nif::RC_RootCollisionNode);
if (node->recType == Nif::RC_RootCollisionNode && autogenerated)
Log(Debug::Info) << "Found RootCollisionNode attached to non-root node in " << fileName << ". Treat it as a common NiTriShape.";
// Don't collide with AvoidNode shapes // Don't collide with AvoidNode shapes
if(node->recType == Nif::RC_AvoidNode) if(node->recType == Nif::RC_AvoidNode)
flags |= 0x800; flags |= 0x800;
@ -234,6 +219,7 @@ void BulletNifLoader::handleNode(const std::string& fileName, const Nif::Node *n
// Marker can still have collision if the model explicitely specifies it via a RootCollisionNode. // Marker can still have collision if the model explicitely specifies it via a RootCollisionNode.
return; return;
} }
} }
} }
@ -256,7 +242,7 @@ void BulletNifLoader::handleNode(const std::string& fileName, const Nif::Node *n
for(size_t i = 0;i < list.length();i++) for(size_t i = 0;i < list.length();i++)
{ {
if(!list[i].empty()) if(!list[i].empty())
handleNode(fileName, list[i].getPtr(), flags, isCollisionNode, isAnimated, autogenerated); handleNode(list[i].getPtr(), flags, isCollisionNode, isAnimated, autogenerated);
} }
} }
} }

@ -55,9 +55,9 @@ public:
private: private:
bool findBoundingBox(const Nif::Node* node, int flags = 0); bool findBoundingBox(const Nif::Node* node, int flags = 0);
void handleNode(const std::string& fileName, Nif::Node const *node, int flags, bool isCollisionNode, bool isAnimated=false, bool autogenerated=false); void handleNode(Nif::Node const *node, int flags, bool isCollisionNode, bool isAnimated=false, bool autogenerated=false);
const Nif::Node* getCollisionNode(const Nif::Node* rootNode); bool hasAutoGeneratedCollision(const Nif::Node *rootNode);
void handleNiTriShape(const Nif::NiTriShape *shape, int flags, const osg::Matrixf& transform, bool isAnimated); void handleNiTriShape(const Nif::NiTriShape *shape, int flags, const osg::Matrixf& transform, bool isAnimated);

Loading…
Cancel
Save