Added support for enable/disabling the keystone editing using the Ctrl-g key to toggle the UI and grid on/off.

This commit is contained in:
Robert Osfield 2013-04-12 13:01:51 +00:00
parent efbf05cd59
commit bc288d23dc

View File

@ -32,6 +32,7 @@ class Keystone : public osg::Referenced
{ {
public: public:
Keystone(): Keystone():
keystoneEditingEnabled(false),
bottom_left(-1.0,-1.0), bottom_left(-1.0,-1.0),
bottom_right(1.0,-1.0), bottom_right(1.0,-1.0),
top_left(-1.0,1.0), top_left(-1.0,1.0),
@ -48,6 +49,7 @@ public:
Keystone& operator = (const Keystone& rhs) Keystone& operator = (const Keystone& rhs)
{ {
if (&rhs==this) return *this; if (&rhs==this) return *this;
keystoneEditingEnabled = rhs.keystoneEditingEnabled;
bottom_left = rhs.bottom_left; bottom_left = rhs.bottom_left;
bottom_right = rhs.bottom_right; bottom_right = rhs.bottom_right;
top_left = rhs.top_left; top_left = rhs.top_left;
@ -55,6 +57,8 @@ public:
return *this; return *this;
} }
bool keystoneEditingEnabled;
osg::Vec2d bottom_left; osg::Vec2d bottom_left;
osg::Vec2d bottom_right; osg::Vec2d bottom_right;
osg::Vec2d top_left; osg::Vec2d top_left;
@ -93,6 +97,9 @@ public:
bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa); bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa);
void setKeystoneEditingEnabled(bool enabled) { if (_currentControlPoints.valid()) _currentControlPoints->keystoneEditingEnabled = enabled; }
bool getKeystoneEditingEnabled() const { return _currentControlPoints.valid() ? _currentControlPoints->keystoneEditingEnabled : false; }
enum Region enum Region
{ {
NONE_SELECTED, NONE_SELECTED,
@ -224,6 +231,8 @@ bool KeystoneHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionA
switch(ea.getEventType()) switch(ea.getEventType())
{ {
case(osgGA::GUIEventAdapter::PUSH): case(osgGA::GUIEventAdapter::PUSH):
{
if (getKeystoneEditingEnabled())
{ {
osg::Vec2d scale = incrementScale(ea); osg::Vec2d scale = incrementScale(ea);
if (scale.length2()!=0.0) if (scale.length2()!=0.0)
@ -236,9 +245,12 @@ bool KeystoneHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionA
{ {
_selectedRegion = NONE_SELECTED; _selectedRegion = NONE_SELECTED;
} }
}
return false; return false;
} }
case(osgGA::GUIEventAdapter::DRAG): case(osgGA::GUIEventAdapter::DRAG):
{
if (getKeystoneEditingEnabled())
{ {
if (_selectedRegion!=NONE_SELECTED) if (_selectedRegion!=NONE_SELECTED)
{ {
@ -249,17 +261,26 @@ bool KeystoneHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionA
move(_selectedRegion, osg::Vec2d(delta.x()*scale.x(), delta.y()*scale.y()) ); move(_selectedRegion, osg::Vec2d(delta.x()*scale.x(), delta.y()*scale.y()) );
return true; return true;
} }
}
return false; return false;
} }
case(osgGA::GUIEventAdapter::RELEASE): case(osgGA::GUIEventAdapter::RELEASE):
{
if (getKeystoneEditingEnabled())
{ {
_selectedRegion = NONE_SELECTED; _selectedRegion = NONE_SELECTED;
}
return false; return false;
} }
case(osgGA::GUIEventAdapter::KEYDOWN): case(osgGA::GUIEventAdapter::KEYDOWN):
{ {
if (ea.getKey()=='r') if (getKeystoneEditingEnabled())
{
if (ea.getUnmodifiedKey()=='g' && (ea.getModKeyMask()==osgGA::GUIEventAdapter::MODKEY_LEFT_CTRL || ea.getModKeyMask()==osgGA::GUIEventAdapter::MODKEY_RIGHT_CTRL))
{
setKeystoneEditingEnabled(false);
}
else if (ea.getKey()=='r')
{ {
_selectedRegion = NONE_SELECTED; _selectedRegion = NONE_SELECTED;
_startControlPoints->reset(); _startControlPoints->reset();
@ -297,9 +318,10 @@ bool KeystoneHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionA
{ {
_currentControlPoints->bottom_left.set(ea.getXnormalized(), ea.getYnormalized()); _currentControlPoints->bottom_left.set(ea.getXnormalized(), ea.getYnormalized());
} }
else }
else if (ea.getUnmodifiedKey()=='g' && (ea.getModKeyMask()==osgGA::GUIEventAdapter::MODKEY_LEFT_CTRL || ea.getModKeyMask()==osgGA::GUIEventAdapter::MODKEY_RIGHT_CTRL))
{ {
OSG_NOTICE<<"key = 0x"<<std::hex<<ea.getKey()<<std::dec<<std::endl; setKeystoneEditingEnabled(true);
} }
return false; return false;
} }
@ -307,6 +329,22 @@ bool KeystoneHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionA
return false; return false;
} }
} }
struct KeystoneCullCallback : public osg::Drawable::CullCallback
{
KeystoneCullCallback(Keystone* keystone=0):_keystone(keystone) {}
KeystoneCullCallback(const KeystoneCullCallback&, const osg::CopyOp&) {}
META_Object(osg,KeystoneCullCallback);
/** do customized cull code, return true if drawable should be culled.*/
virtual bool cull(osg::NodeVisitor* nv, osg::Drawable* drawable, osg::RenderInfo* renderInfo) const
{
return _keystone.valid() ? !_keystone->keystoneEditingEnabled : true;
}
osg::ref_ptr<Keystone> _keystone;
};
struct KeystoneUpdateCallback : public osg::Drawable::UpdateCallback struct KeystoneUpdateCallback : public osg::Drawable::UpdateCallback
{ {
@ -429,6 +467,8 @@ osg::Node* createGrid(Keystone* keystone, const osg::Vec4& colour)
osg::ref_ptr<KeystoneUpdateCallback> kuc = new KeystoneUpdateCallback(keystone); osg::ref_ptr<KeystoneUpdateCallback> kuc = new KeystoneUpdateCallback(keystone);
geometry->setUpdateCallback(kuc.get()); geometry->setUpdateCallback(kuc.get());
geometry->setCullCallback(new KeystoneCullCallback(keystone));
osg::ref_ptr<osg::Vec4Array> colours = new osg::Vec4Array; osg::ref_ptr<osg::Vec4Array> colours = new osg::Vec4Array;
colours->push_back(osg::Vec4(1.0f,1.0f,1.0f,1.0f)); colours->push_back(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
geometry->setColorArray(colours.get()); geometry->setColorArray(colours.get());