add condition to pick animations

This commit is contained in:
Richard Harrison
2017-12-04 07:31:59 +01:00
parent 854881bba2
commit 7dcc359110
2 changed files with 76 additions and 51 deletions

View File

@@ -74,10 +74,12 @@ osg::Vec2d eventToWindowCoords(const osgGA::GUIEventAdapter& ea)
class SGPickAnimation::PickCallback : public SGPickCallback {
public:
PickCallback(const SGPropertyNode* configNode,
SGPropertyNode* modelRoot) :
SGPropertyNode* modelRoot,
SGSharedPtr<SGCondition const> condition) :
SGPickCallback(PriorityPanel),
_repeatable(configNode->getBoolValue("repeatable", false)),
_repeatInterval(configNode->getDoubleValue("interval-sec", 0.1))
_repeatInterval(configNode->getDoubleValue("interval-sec", 0.1)),
_condition(condition)
{
std::vector<SGPropertyNode_ptr> bindings;
@@ -98,63 +100,76 @@ osg::Vec2d eventToWindowCoords(const osgGA::GUIEventAdapter& ea)
void addHoverBindings(const SGPropertyNode* hoverNode,
SGPropertyNode* modelRoot)
{
_hover = readBindingList(hoverNode->getChildren("binding"), modelRoot);
if (!_condition || _condition->test()) {
_hover = readBindingList(hoverNode->getChildren("binding"), modelRoot);
}
}
virtual bool buttonPressed( int button,
const osgGA::GUIEventAdapter&,
const Info& )
{
if (_buttons.find(button) == _buttons.end()) {
return false;
}
if (!_condition || _condition->test()) {
if (_buttons.find(button) == _buttons.end()) {
return false;
}
if (!anyBindingEnabled(_bindingsDown)) {
return false;
}
if (!anyBindingEnabled(_bindingsDown)) {
return false;
}
fireBindingList(_bindingsDown);
_repeatTime = -_repeatInterval; // anti-bobble: delay start of repeat
return true;
fireBindingList(_bindingsDown);
_repeatTime = -_repeatInterval; // anti-bobble: delay start of repeat
return true;
}
return false;
}
virtual void buttonReleased( int keyModState,
const osgGA::GUIEventAdapter&,
const Info* )
{
SG_UNUSED(keyModState);
fireBindingList(_bindingsUp);
if (!_condition || _condition->test()) {
SG_UNUSED(keyModState);
fireBindingList(_bindingsUp);
}
}
virtual void update(double dt, int keyModState)
{
SG_UNUSED(keyModState);
if (!_repeatable)
return;
if (!_condition || _condition->test()) {
SG_UNUSED(keyModState);
if (!_repeatable)
return;
_repeatTime += dt;
while (_repeatInterval < _repeatTime) {
_repeatTime -= _repeatInterval;
fireBindingList(_bindingsDown);
}
_repeatTime += dt;
while (_repeatInterval < _repeatTime) {
_repeatTime -= _repeatInterval;
fireBindingList(_bindingsDown);
}
}
}
virtual bool hover( const osg::Vec2d& windowPos,
const Info& )
{
if (!anyBindingEnabled(_hover)) {
return false;
if (!_condition || _condition->test()) {
if (!anyBindingEnabled(_hover)) {
return false;
}
SGPropertyNode_ptr params(new SGPropertyNode);
params->setDoubleValue("x", windowPos.x());
params->setDoubleValue("y", windowPos.y());
fireBindingList(_hover, params.ptr());
return true;
}
SGPropertyNode_ptr params(new SGPropertyNode);
params->setDoubleValue("x", windowPos.x());
params->setDoubleValue("y", windowPos.y());
fireBindingList(_hover, params.ptr());
return true;
return false;
}
std::string getCursor() const
{ return _cursorName; }
private:
SGSharedPtr<SGCondition const> _condition;
SGBindingList _bindingsDown;
SGBindingList _bindingsUp;
SGBindingList _hover;
@@ -247,8 +262,9 @@ class SGPickAnimation::VncCallback : public SGPickCallback {
public:
VncCallback(const SGPropertyNode* configNode,
SGPropertyNode* modelRoot,
osg::Group *node)
: _node(node)
osg::Group *node,
SGSharedPtr<SGCondition const> condition)
: _node(node), _condition(condition)
{
SG_LOG(SG_INPUT, SG_DEBUG, "Configuring VNC callback");
const char *cornernames[3] = {"top-left", "top-right", "bottom-left"};
@@ -270,29 +286,35 @@ public:
const osgGA::GUIEventAdapter&,
const Info& info )
{
SGVec3d loc(info.local);
SG_LOG(SG_INPUT, SG_DEBUG, "VNC pressed " << button << ": " << loc);
loc -= _topLeft;
_x = dot(loc, _toRight) / _squaredRight;
_y = dot(loc, _toDown) / _squaredDown;
if (_x<0) _x = 0; else if (_x > 1) _x = 1;
if (_y<0) _y = 0; else if (_y > 1) _y = 1;
VncVisitor vv(_x, _y, 1 << button);
_node->accept(vv);
return vv.wasSuccessful();
if (!_condition || _condition->test()) {
SGVec3d loc(info.local);
SG_LOG(SG_INPUT, SG_DEBUG, "VNC pressed " << button << ": " << loc);
loc -= _topLeft;
_x = dot(loc, _toRight) / _squaredRight;
_y = dot(loc, _toDown) / _squaredDown;
if (_x < 0) _x = 0; else if (_x > 1) _x = 1;
if (_y < 0) _y = 0; else if (_y > 1) _y = 1;
VncVisitor vv(_x, _y, 1 << button);
_node->accept(vv);
return vv.wasSuccessful();
}
return false;
}
virtual void buttonReleased( int keyModState,
const osgGA::GUIEventAdapter&,
const Info* )
{
SG_UNUSED(keyModState);
SG_LOG(SG_INPUT, SG_DEBUG, "VNC release");
VncVisitor vv(_x, _y, 0);
_node->accept(vv);
if (!_condition || _condition->test()) {
SG_UNUSED(keyModState);
SG_LOG(SG_INPUT, SG_DEBUG, "VNC release");
VncVisitor vv(_x, _y, 0);
_node->accept(vv);
}
}
private:
SGSharedPtr<SGCondition const> _condition;
double _x, _y;
osg::ref_ptr<osg::Group> _node;
SGVec3d _topLeft, _toRight, _toDown;
@@ -304,6 +326,8 @@ private:
SGPickAnimation::SGPickAnimation(simgear::SGTransientModelData &modelData) :
SGAnimation(modelData)
{
_condition = getCondition();
std::vector<SGPropertyNode_ptr> names = modelData.getConfigNode()->getChildren("proxy-name");
for (unsigned i = 0; i < names.size(); ++i) {
_proxyNames.push_back(names[i]->getStringValue());
@@ -451,7 +475,7 @@ SGPickAnimation::setupCallbacks(SGSceneUserData* ud, osg::Group* parent)
std::vector<SGPropertyNode_ptr> actions;
actions = getConfig()->getChildren("action");
for (unsigned int i = 0; i < actions.size(); ++i) {
pickCb = new PickCallback(actions[i], getModelRoot());
pickCb = new PickCallback(actions[i], getModelRoot(), _condition);
ud->addPickCallback(pickCb);
}
@@ -459,7 +483,7 @@ SGPickAnimation::setupCallbacks(SGSceneUserData* ud, osg::Group* parent)
if (!pickCb) {
// make a trivial PickCallback to hang the hovered off of
SGPropertyNode_ptr dummyNode(new SGPropertyNode);
pickCb = new PickCallback(dummyNode.ptr(), getModelRoot());
pickCb = new PickCallback(dummyNode.ptr(), getModelRoot(), _condition);
ud->addPickCallback(pickCb);
}
@@ -469,7 +493,7 @@ SGPickAnimation::setupCallbacks(SGSceneUserData* ud, osg::Group* parent)
// Look for the VNC sessions that want raw mouse input
actions = getConfig()->getChildren("vncaction");
for (unsigned int i = 0; i < actions.size(); ++i) {
ud->addPickCallback(new VncCallback(actions[i], getModelRoot(), parent));
ud->addPickCallback(new VncCallback(actions[i], getModelRoot(), parent, _condition));
}
}

View File

@@ -45,7 +45,8 @@ protected:
virtual osg::Group* createMainGroup(osg::Group* pr);
SGSharedPtr<SGCondition const> _condition;
virtual void setupCallbacks(SGSceneUserData* ud, osg::Group* parent);
private:
class PickCallback;