openmw-tes3coop/components/sceneutil/controller.cpp
scrawl 8b596dfcbe Remove support for OSG 3.2
Since commit e8662bea31, 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

138 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;
}
}