1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-03-25 16:43:33 +00:00

Handle NiCollisionSwitch node

This commit is contained in:
Andrei Kortunov 2020-02-19 12:14:21 +04:00
parent 9b9769a123
commit 77d6fe46ca
5 changed files with 30 additions and 1 deletions

View File

@ -48,6 +48,7 @@ static std::map<std::string,RecordFactoryEntry> makeFactory()
newFactory.insert(makeEntry("NiSwitchNode", &construct <NiSwitchNode> , RC_NiSwitchNode )); newFactory.insert(makeEntry("NiSwitchNode", &construct <NiSwitchNode> , RC_NiSwitchNode ));
newFactory.insert(makeEntry("NiLODNode", &construct <NiLODNode> , RC_NiLODNode )); newFactory.insert(makeEntry("NiLODNode", &construct <NiLODNode> , RC_NiLODNode ));
newFactory.insert(makeEntry("AvoidNode", &construct <NiNode> , RC_AvoidNode )); newFactory.insert(makeEntry("AvoidNode", &construct <NiNode> , RC_AvoidNode ));
newFactory.insert(makeEntry("NiCollisionSwitch", &construct <NiNode> , RC_NiCollisionSwitch ));
newFactory.insert(makeEntry("NiBSParticleNode", &construct <NiNode> , RC_NiBSParticleNode )); newFactory.insert(makeEntry("NiBSParticleNode", &construct <NiNode> , RC_NiBSParticleNode ));
newFactory.insert(makeEntry("NiBSAnimationNode", &construct <NiNode> , RC_NiBSAnimationNode )); newFactory.insert(makeEntry("NiBSAnimationNode", &construct <NiNode> , RC_NiBSAnimationNode ));
newFactory.insert(makeEntry("NiBillboardNode", &construct <NiNode> , RC_NiBillboardNode )); newFactory.insert(makeEntry("NiBillboardNode", &construct <NiNode> , RC_NiBillboardNode ));

View File

@ -84,7 +84,8 @@ struct NiNode : Node
enum Flags { enum Flags {
Flag_Hidden = 0x0001, Flag_Hidden = 0x0001,
Flag_MeshCollision = 0x0002, Flag_MeshCollision = 0x0002,
Flag_BBoxCollision = 0x0004 Flag_BBoxCollision = 0x0004,
Flag_ActiveCollision = 0x0020
}; };
enum BSAnimFlags { enum BSAnimFlags {
AnimFlag_AutoPlay = 0x0020 AnimFlag_AutoPlay = 0x0020

View File

@ -40,6 +40,7 @@ enum RecordType
RC_NiLODNode, RC_NiLODNode,
RC_NiBillboardNode, RC_NiBillboardNode,
RC_AvoidNode, RC_AvoidNode,
RC_NiCollisionSwitch,
RC_NiTriShape, RC_NiTriShape,
RC_NiTriStrips, RC_NiTriStrips,
RC_NiRotatingParticles, RC_NiRotatingParticles,

View File

@ -254,6 +254,10 @@ bool BulletNifLoader::hasAutoGeneratedCollision(const Nif::Node* rootNode)
void BulletNifLoader::handleNode(const std::string& fileName, const Nif::Node *node, int flags, void BulletNifLoader::handleNode(const std::string& fileName, const Nif::Node *node, int flags,
bool isCollisionNode, bool isAnimated, bool autogenerated, bool avoid) bool isCollisionNode, bool isAnimated, bool autogenerated, bool avoid)
{ {
// TODO: allow on-the fly collision switching via toggling this flag
if (node->recType == Nif::RC_NiCollisionSwitch && !(node->flags & Nif::NiNode::Flag_ActiveCollision))
return;
// Accumulate the flags from all the child nodes. This works for all // Accumulate the flags from all the child nodes. This works for all
// the flags we currently use, at least. // the flags we currently use, at least.
flags |= node->flags; flags |= node->flags;

View File

@ -168,6 +168,20 @@ namespace
namespace NifOsg namespace NifOsg
{ {
class CollisionSwitch : public osg::Group
{
public:
CollisionSwitch(bool enabled) : osg::Group()
{
setEnabled(enabled);
}
void setEnabled(bool enabled)
{
setNodeMask(enabled ? SceneUtil::Mask_Default : SceneUtil::Mask_Effect);
}
};
bool Loader::sShowMarkers = false; bool Loader::sShowMarkers = false;
void Loader::setShowMarkers(bool show) void Loader::setShowMarkers(bool show)
@ -460,6 +474,14 @@ namespace NifOsg
case Nif::RC_NiBillboardNode: case Nif::RC_NiBillboardNode:
dataVariance = osg::Object::DYNAMIC; dataVariance = osg::Object::DYNAMIC;
break; break;
case Nif::RC_NiCollisionSwitch:
{
bool enabled = nifNode->flags & Nif::NiNode::Flag_ActiveCollision;
node = new CollisionSwitch(enabled);
dataVariance = osg::Object::STATIC;
break;
}
default: default:
// The Root node can be created as a Group if no transformation is required. // The Root node can be created as a Group if no transformation is required.
// This takes advantage of the fact root nodes can't have additional controllers // This takes advantage of the fact root nodes can't have additional controllers