TES3MP/components/sceneutil/controller.cpp
scrawl 8b596dfcbe Remove support for OSG 3.2
Since commit e8662bea3133ba9dbb09b86c3abb1af39425e90d, we're using OSG functionality that contains an unfixed crash bug in version 3.2. The bug is fixed in version 3.4 (OSG commit 6351e5020371b0b72b300088a5c6772f58379b84)
2016-02-12 14:46:45 +01:00

139 lines
3.4 KiB
C++

#include "controller.hpp"
#include "statesetupdater.hpp"
#include <osg/Drawable>
#include <osg/Geode>
#include <osg/NodeCallback>
#include <osg/Version>
namespace SceneUtil
{
Controller::Controller()
{
}
bool Controller::hasInput() const
{
return mSource.get() != NULL;
}
float Controller::getInputValue(osg::NodeVisitor* nv)
{
if (mFunction)
return mFunction->calculate(mSource->getValue(nv));
else
return mSource->getValue(nv);
}
void Controller::setSource(boost::shared_ptr<ControllerSource> source)
{
mSource = source;
}
void Controller::setFunction(boost::shared_ptr<ControllerFunction> function)
{
mFunction = function;
}
boost::shared_ptr<ControllerSource> Controller::getSource() const
{
return mSource;
}
boost::shared_ptr<ControllerFunction> Controller::getFunction() const
{
return mFunction;
}
FrameTimeSource::FrameTimeSource()
{
}
float FrameTimeSource::getValue(osg::NodeVisitor *nv)
{
return nv->getFrameStamp()->getSimulationTime();
}
ControllerVisitor::ControllerVisitor()
: osg::NodeVisitor(TRAVERSE_ALL_CHILDREN)
{
}
void ControllerVisitor::apply(osg::Node &node)
{
osg::Callback* callback = node.getUpdateCallback();
while (callback)
{
if (Controller* ctrl = dynamic_cast<Controller*>(callback))
visit(node, *ctrl);
if (CompositeStateSetUpdater* composite = dynamic_cast<CompositeStateSetUpdater*>(callback))
{
for (unsigned int i=0; i<composite->getNumControllers(); ++i)
{
StateSetUpdater* statesetcontroller = composite->getController(i);
if (Controller* ctrl = dynamic_cast<Controller*>(statesetcontroller))
visit(node, *ctrl);
}
}
callback = callback->getNestedCallback();
}
traverse(node);
}
void ControllerVisitor::apply(osg::Geode &geode)
{
for (unsigned int i=0; i<geode.getNumDrawables(); ++i)
{
osg::Drawable* drw = geode.getDrawable(i);
osg::Callback* callback = drw->getUpdateCallback();
if (Controller* ctrl = dynamic_cast<Controller*>(callback))
visit(geode, *ctrl);
}
apply(static_cast<osg::Node&>(geode));
}
AssignControllerSourcesVisitor::AssignControllerSourcesVisitor()
: ControllerVisitor()
{
}
AssignControllerSourcesVisitor::AssignControllerSourcesVisitor(boost::shared_ptr<ControllerSource> toAssign)
: ControllerVisitor()
, mToAssign(toAssign)
{
}
void AssignControllerSourcesVisitor::visit(osg::Node&, Controller &ctrl)
{
if (!ctrl.getSource())
ctrl.setSource(mToAssign);
}
FindMaxControllerLengthVisitor::FindMaxControllerLengthVisitor()
: SceneUtil::ControllerVisitor()
, mMaxLength(0)
{
}
void FindMaxControllerLengthVisitor::visit(osg::Node &, Controller &ctrl)
{
if (ctrl.getFunction())
mMaxLength = std::max(mMaxLength, ctrl.getFunction()->getMaximum());
}
float FindMaxControllerLengthVisitor::getMaxLength() const
{
return mMaxLength;
}
}