forked from mirror/openmw-tes3mp
Add explicit handling of most commonly used nodes to NodeVisitors to avoid excessive virtual function calls
This commit is contained in:
parent
c95868969b
commit
33e654f94d
8 changed files with 109 additions and 5 deletions
|
@ -179,6 +179,15 @@ namespace
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void apply(osg::Group& node)
|
||||||
|
{
|
||||||
|
traverse(node);
|
||||||
|
}
|
||||||
|
virtual void apply(osg::MatrixTransform& node)
|
||||||
|
{
|
||||||
|
traverse(node);
|
||||||
|
}
|
||||||
|
|
||||||
void remove()
|
void remove()
|
||||||
{
|
{
|
||||||
for (RemoveVec::iterator it = mToRemove.begin(); it != mToRemove.end(); ++it)
|
for (RemoveVec::iterator it = mToRemove.begin(); it != mToRemove.end(); ++it)
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
|
||||||
#include <osg/MatrixTransform>
|
#include <osg/MatrixTransform>
|
||||||
|
#include <osg/Geometry>
|
||||||
|
|
||||||
#include <components/nif/controlled.hpp>
|
#include <components/nif/controlled.hpp>
|
||||||
#include <components/nif/nifkey.hpp>
|
#include <components/nif/nifkey.hpp>
|
||||||
|
@ -315,7 +316,22 @@ FindGroupByRecIndex::FindGroupByRecIndex(int recIndex)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void FindGroupByRecIndex::apply(osg::Node &searchNode)
|
void FindGroupByRecIndex::apply(osg::Node &node)
|
||||||
|
{
|
||||||
|
applyNode(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FindGroupByRecIndex::apply(osg::MatrixTransform &node)
|
||||||
|
{
|
||||||
|
applyNode(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FindGroupByRecIndex::apply(osg::Geometry &node)
|
||||||
|
{
|
||||||
|
applyNode(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FindGroupByRecIndex::applyNode(osg::Node &searchNode)
|
||||||
{
|
{
|
||||||
if (searchNode.getUserDataContainer() && searchNode.getUserDataContainer()->getNumUserObjects())
|
if (searchNode.getUserDataContainer() && searchNode.getUserDataContainer()->getNumUserObjects())
|
||||||
{
|
{
|
||||||
|
|
|
@ -196,7 +196,14 @@ namespace NifOsg
|
||||||
public:
|
public:
|
||||||
FindGroupByRecIndex(int recIndex);
|
FindGroupByRecIndex(int recIndex);
|
||||||
|
|
||||||
virtual void apply(osg::Node &searchNode);
|
virtual void apply(osg::Node &node);
|
||||||
|
|
||||||
|
// Technically not required as the default implementation would trickle down to apply(Node&) anyway,
|
||||||
|
// but we'll shortcut instead to avoid the chain of virtual function calls
|
||||||
|
virtual void apply(osg::MatrixTransform& node);
|
||||||
|
virtual void apply(osg::Geometry& node);
|
||||||
|
|
||||||
|
void applyNode(osg::Node& searchNode);
|
||||||
|
|
||||||
osg::Group* mFound;
|
osg::Group* mFound;
|
||||||
osg::NodePath mFoundPath;
|
osg::NodePath mFoundPath;
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
#include <osg/NodeVisitor>
|
#include <osg/NodeVisitor>
|
||||||
#include <osg/Group>
|
#include <osg/Group>
|
||||||
|
#include <osg/Geometry>
|
||||||
#include <osg/FrontFace>
|
#include <osg/FrontFace>
|
||||||
#include <osg/PositionAttitudeTransform>
|
#include <osg/PositionAttitudeTransform>
|
||||||
#include <osg/MatrixTransform>
|
#include <osg/MatrixTransform>
|
||||||
|
@ -29,7 +30,24 @@ namespace SceneUtil
|
||||||
mFilter2 = "tri " + mFilter;
|
mFilter2 = "tri " + mFilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void apply(osg::MatrixTransform& node)
|
||||||
|
{
|
||||||
|
applyNode(node);
|
||||||
|
}
|
||||||
|
virtual void apply(osg::Geometry& node)
|
||||||
|
{
|
||||||
|
applyNode(node);
|
||||||
|
}
|
||||||
virtual void apply(osg::Node& node)
|
virtual void apply(osg::Node& node)
|
||||||
|
{
|
||||||
|
applyNode(node);
|
||||||
|
}
|
||||||
|
virtual void apply(osg::Group& node)
|
||||||
|
{
|
||||||
|
applyNode(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
void applyNode(osg::Node& node)
|
||||||
{
|
{
|
||||||
std::string lowerName = Misc::StringUtils::lowerCase(node.getName());
|
std::string lowerName = Misc::StringUtils::lowerCase(node.getName());
|
||||||
if ((lowerName.size() >= mFilter.size() && lowerName.compare(0, mFilter.size(), mFilter) == 0)
|
if ((lowerName.size() >= mFilter.size() && lowerName.compare(0, mFilter.size(), mFilter) == 0)
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
#include "statesetupdater.hpp"
|
#include "statesetupdater.hpp"
|
||||||
|
|
||||||
#include <osg/Drawable>
|
#include <osg/Drawable>
|
||||||
|
#include <osg/Geometry>
|
||||||
|
#include <osg/MatrixTransform>
|
||||||
#include <osg/NodeCallback>
|
#include <osg/NodeCallback>
|
||||||
|
|
||||||
namespace SceneUtil
|
namespace SceneUtil
|
||||||
|
@ -62,6 +64,21 @@ namespace SceneUtil
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControllerVisitor::apply(osg::Node &node)
|
void ControllerVisitor::apply(osg::Node &node)
|
||||||
|
{
|
||||||
|
applyNode(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ControllerVisitor::apply(osg::MatrixTransform &node)
|
||||||
|
{
|
||||||
|
applyNode(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ControllerVisitor::apply(osg::Geometry &node)
|
||||||
|
{
|
||||||
|
applyNode(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ControllerVisitor::applyNode(osg::Node &node)
|
||||||
{
|
{
|
||||||
osg::Callback* callback = node.getUpdateCallback();
|
osg::Callback* callback = node.getUpdateCallback();
|
||||||
while (callback)
|
while (callback)
|
||||||
|
|
|
@ -64,6 +64,13 @@ namespace SceneUtil
|
||||||
|
|
||||||
virtual void apply(osg::Node& node);
|
virtual void apply(osg::Node& node);
|
||||||
|
|
||||||
|
// Technically not required as the default implementation would trickle down to apply(Node&) anyway,
|
||||||
|
// but we'll shortcut instead to avoid the chain of virtual function calls
|
||||||
|
virtual void apply(osg::MatrixTransform& node);
|
||||||
|
virtual void apply(osg::Geometry& node);
|
||||||
|
|
||||||
|
void applyNode(osg::Node& node);
|
||||||
|
|
||||||
virtual void visit(osg::Node& node, Controller& ctrl) = 0;
|
virtual void visit(osg::Node& node, Controller& ctrl) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
#include "visitor.hpp"
|
#include "visitor.hpp"
|
||||||
|
|
||||||
|
#include <osg/MatrixTransform>
|
||||||
|
|
||||||
#include <osgParticle/ParticleSystem>
|
#include <osgParticle/ParticleSystem>
|
||||||
|
|
||||||
#include <components/misc/stringops.hpp>
|
#include <components/misc/stringops.hpp>
|
||||||
|
@ -7,16 +9,37 @@
|
||||||
namespace SceneUtil
|
namespace SceneUtil
|
||||||
{
|
{
|
||||||
|
|
||||||
void FindByNameVisitor::apply(osg::Group &group)
|
bool FindByNameVisitor::checkGroup(osg::Group &group)
|
||||||
{
|
{
|
||||||
if (Misc::StringUtils::ciEqual(group.getName(), mNameToFind))
|
if (Misc::StringUtils::ciEqual(group.getName(), mNameToFind))
|
||||||
{
|
{
|
||||||
mFoundNode = &group;
|
mFoundNode = &group;
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FindByNameVisitor::apply(osg::Group &group)
|
||||||
|
{
|
||||||
|
if (!checkGroup(group))
|
||||||
traverse(group);
|
traverse(group);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FindByNameVisitor::apply(osg::MatrixTransform &node)
|
||||||
|
{
|
||||||
|
if (!checkGroup(node))
|
||||||
|
traverse(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FindByNameVisitor::apply(osg::Geometry&)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisableFreezeOnCullVisitor::apply(osg::MatrixTransform &node)
|
||||||
|
{
|
||||||
|
traverse(node);
|
||||||
|
}
|
||||||
|
|
||||||
void DisableFreezeOnCullVisitor::apply(osg::Drawable& drw)
|
void DisableFreezeOnCullVisitor::apply(osg::Drawable& drw)
|
||||||
{
|
{
|
||||||
if (osgParticle::ParticleSystem* partsys = dynamic_cast<osgParticle::ParticleSystem*>(&drw))
|
if (osgParticle::ParticleSystem* partsys = dynamic_cast<osgParticle::ParticleSystem*>(&drw))
|
||||||
|
|
|
@ -21,6 +21,11 @@ namespace SceneUtil
|
||||||
|
|
||||||
virtual void apply(osg::Group& group);
|
virtual void apply(osg::Group& group);
|
||||||
|
|
||||||
|
virtual void apply(osg::MatrixTransform& node);
|
||||||
|
virtual void apply(osg::Geometry& node);
|
||||||
|
|
||||||
|
bool checkGroup(osg::Group& group);
|
||||||
|
|
||||||
std::string mNameToFind;
|
std::string mNameToFind;
|
||||||
osg::Group* mFoundNode;
|
osg::Group* mFoundNode;
|
||||||
};
|
};
|
||||||
|
@ -34,6 +39,8 @@ namespace SceneUtil
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void apply(osg::MatrixTransform& node);
|
||||||
|
|
||||||
virtual void apply(osg::Drawable& drw);
|
virtual void apply(osg::Drawable& drw);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue