Cleaned up event handler and namespaces in prep for integrating keystone functionality into osgViewer
This commit is contained in:
parent
8810d27f7c
commit
046c3fca7a
@ -30,7 +30,10 @@
|
||||
#include <osgViewer/ViewerEventHandlers>
|
||||
|
||||
|
||||
class Keystone : public osg::Referenced
|
||||
namespace osg
|
||||
{
|
||||
|
||||
class Keystone : public osg::Object
|
||||
{
|
||||
public:
|
||||
Keystone():
|
||||
@ -41,6 +44,16 @@ public:
|
||||
top_left(-1.0,1.0),
|
||||
top_right(1.0,1.0) {}
|
||||
|
||||
Keystone(const Keystone& rhs, const osg::CopyOp&):
|
||||
keystoneEditingEnabled(rhs.keystoneEditingEnabled),
|
||||
gridColour(rhs.gridColour),
|
||||
bottom_left(rhs.bottom_left),
|
||||
bottom_right(rhs.bottom_right),
|
||||
top_left(rhs.top_left),
|
||||
top_right(rhs.top_right) {}
|
||||
|
||||
META_Object(osg, Keystone)
|
||||
|
||||
void reset()
|
||||
{
|
||||
bottom_left.set(-1.0,-1.0);
|
||||
@ -89,15 +102,22 @@ public:
|
||||
br = osg::Vec3(screenWidth*0.5*bottom_right.x(), screenHeight*0.5*bottom_right.y(), -screenDistance)*r_right*r_bottom;
|
||||
bl = osg::Vec3(screenWidth*0.5*bottom_left.x(), screenHeight*0.5*bottom_left.y(), -screenDistance)*r_left*r_bottom;
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
virtual ~Keystone() {}
|
||||
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
class KeystoneHandler : public osgGA::GUIEventHandler
|
||||
{
|
||||
public:
|
||||
|
||||
KeystoneHandler(Keystone* keystone);
|
||||
KeystoneHandler(osg::Keystone* keystone);
|
||||
|
||||
~KeystoneHandler() {}
|
||||
|
||||
@ -127,22 +147,22 @@ public:
|
||||
protected:
|
||||
|
||||
|
||||
osg::ref_ptr<Keystone> _keystone;
|
||||
osg::ref_ptr<osg::Keystone> _keystone;
|
||||
|
||||
osg::Vec2d _defaultIncrement;
|
||||
osg::Vec2d _ctrlIncrement;
|
||||
osg::Vec2d _shiftIncrement;
|
||||
osg::Vec2d _keyIncrement;
|
||||
osg::Vec2d _defaultIncrement;
|
||||
osg::Vec2d _ctrlIncrement;
|
||||
osg::Vec2d _shiftIncrement;
|
||||
osg::Vec2d _keyIncrement;
|
||||
|
||||
osg::Vec2d _startPosition;
|
||||
osg::ref_ptr<Keystone> _startControlPoints;
|
||||
osg::Vec2d _startPosition;
|
||||
osg::ref_ptr<osg::Keystone> _startControlPoints;
|
||||
|
||||
Region _selectedRegion;
|
||||
osg::ref_ptr<Keystone> _currentControlPoints;
|
||||
Region _selectedRegion;
|
||||
osg::ref_ptr<osg::Keystone> _currentControlPoints;
|
||||
|
||||
};
|
||||
|
||||
KeystoneHandler::KeystoneHandler(Keystone* keystone):
|
||||
KeystoneHandler::KeystoneHandler(osg::Keystone* keystone):
|
||||
_keystone(keystone),
|
||||
_defaultIncrement(0.0,0.0),
|
||||
_ctrlIncrement(1.0,1.0),
|
||||
@ -150,7 +170,7 @@ KeystoneHandler::KeystoneHandler(Keystone* keystone):
|
||||
_keyIncrement(0.005, 0.005),
|
||||
_selectedRegion(NONE_SELECTED)
|
||||
{
|
||||
_startControlPoints = new Keystone;
|
||||
_startControlPoints = new osg::Keystone;
|
||||
_currentControlPoints = keystone; //new Keystone;
|
||||
}
|
||||
|
||||
@ -239,6 +259,15 @@ bool KeystoneHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionA
|
||||
|
||||
if (!viewport) return false;
|
||||
|
||||
if (ea.getEventType()==osgGA::GUIEventAdapter::KEYDOWN)
|
||||
{
|
||||
if (ea.getUnmodifiedKey()=='g' && (ea.getModKeyMask()==osgGA::GUIEventAdapter::MODKEY_LEFT_CTRL || ea.getModKeyMask()==osgGA::GUIEventAdapter::MODKEY_RIGHT_CTRL))
|
||||
{
|
||||
setKeystoneEditingEnabled(!getKeystoneEditingEnabled());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool haveCameraMatch = false;
|
||||
float x = ea.getXnormalized();
|
||||
float y = ea.getYnormalized();
|
||||
@ -254,103 +283,82 @@ bool KeystoneHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionA
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!haveCameraMatch) return false;
|
||||
if (!haveCameraMatch || !getKeystoneEditingEnabled()) return false;
|
||||
|
||||
switch(ea.getEventType())
|
||||
{
|
||||
case(osgGA::GUIEventAdapter::PUSH):
|
||||
{
|
||||
if (getKeystoneEditingEnabled())
|
||||
osg::Vec2d scale = incrementScale(ea);
|
||||
if (scale.length2()!=0.0)
|
||||
{
|
||||
osg::Vec2d scale = incrementScale(ea);
|
||||
if (scale.length2()!=0.0)
|
||||
{
|
||||
_selectedRegion = computeRegion(ea);
|
||||
(*_startControlPoints) = (*_currentControlPoints);
|
||||
_startPosition.set(x,y);
|
||||
}
|
||||
else
|
||||
{
|
||||
_selectedRegion = NONE_SELECTED;
|
||||
}
|
||||
_selectedRegion = computeRegion(ea);
|
||||
(*_startControlPoints) = (*_currentControlPoints);
|
||||
_startPosition.set(x,y);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
case(osgGA::GUIEventAdapter::DRAG):
|
||||
{
|
||||
if (getKeystoneEditingEnabled())
|
||||
{
|
||||
if (_selectedRegion!=NONE_SELECTED)
|
||||
{
|
||||
(*_currentControlPoints) = (*_startControlPoints);
|
||||
osg::Vec2d currentPosition(x, y);
|
||||
osg::Vec2d delta(currentPosition-_startPosition);
|
||||
osg::Vec2d scale = incrementScale(ea);
|
||||
move(_selectedRegion, osg::Vec2d(delta.x()*scale.x(), delta.y()*scale.y()) );
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
case(osgGA::GUIEventAdapter::RELEASE):
|
||||
{
|
||||
if (getKeystoneEditingEnabled())
|
||||
else
|
||||
{
|
||||
_selectedRegion = NONE_SELECTED;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
case(osgGA::GUIEventAdapter::DRAG):
|
||||
{
|
||||
if (_selectedRegion!=NONE_SELECTED)
|
||||
{
|
||||
(*_currentControlPoints) = (*_startControlPoints);
|
||||
osg::Vec2d currentPosition(x, y);
|
||||
osg::Vec2d delta(currentPosition-_startPosition);
|
||||
osg::Vec2d scale = incrementScale(ea);
|
||||
move(_selectedRegion, osg::Vec2d(delta.x()*scale.x(), delta.y()*scale.y()) );
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
case(osgGA::GUIEventAdapter::RELEASE):
|
||||
{
|
||||
_selectedRegion = NONE_SELECTED;
|
||||
return false;
|
||||
}
|
||||
case(osgGA::GUIEventAdapter::KEYDOWN):
|
||||
{
|
||||
if (getKeystoneEditingEnabled())
|
||||
if (ea.getKey()=='r')
|
||||
{
|
||||
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;
|
||||
_startControlPoints->reset();
|
||||
_currentControlPoints->reset();
|
||||
}
|
||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Up)
|
||||
{
|
||||
move(computeRegion(ea), osg::Vec2d(0.0, _keyIncrement.y()*incrementScale(ea).y()) );
|
||||
}
|
||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Down)
|
||||
{
|
||||
move(computeRegion(ea), osg::Vec2d(0.0, -_keyIncrement.y()*incrementScale(ea).y()) );
|
||||
}
|
||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Left)
|
||||
{
|
||||
move(computeRegion(ea), osg::Vec2d(-_keyIncrement.x()*incrementScale(ea).x(), 0.0) );
|
||||
}
|
||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Right)
|
||||
{
|
||||
move(computeRegion(ea), osg::Vec2d(_keyIncrement.x()*incrementScale(ea).x(), 0.0) );
|
||||
}
|
||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_7 || ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Home)
|
||||
{
|
||||
_currentControlPoints->top_left.set(x, y);
|
||||
}
|
||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_9 || ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Page_Up)
|
||||
{
|
||||
_currentControlPoints->top_right.set(x, y);
|
||||
}
|
||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_3 || ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Page_Down)
|
||||
{
|
||||
_currentControlPoints->bottom_right.set(x, y);
|
||||
}
|
||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_1 || ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_End)
|
||||
{
|
||||
_currentControlPoints->bottom_left.set(x, y);
|
||||
}
|
||||
_selectedRegion = NONE_SELECTED;
|
||||
_startControlPoints->reset();
|
||||
_currentControlPoints->reset();
|
||||
}
|
||||
else if (ea.getUnmodifiedKey()=='g' && (ea.getModKeyMask()==osgGA::GUIEventAdapter::MODKEY_LEFT_CTRL || ea.getModKeyMask()==osgGA::GUIEventAdapter::MODKEY_RIGHT_CTRL))
|
||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Up)
|
||||
{
|
||||
setKeystoneEditingEnabled(true);
|
||||
move(computeRegion(ea), osg::Vec2d(0.0, _keyIncrement.y()*incrementScale(ea).y()) );
|
||||
}
|
||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Down)
|
||||
{
|
||||
move(computeRegion(ea), osg::Vec2d(0.0, -_keyIncrement.y()*incrementScale(ea).y()) );
|
||||
}
|
||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Left)
|
||||
{
|
||||
move(computeRegion(ea), osg::Vec2d(-_keyIncrement.x()*incrementScale(ea).x(), 0.0) );
|
||||
}
|
||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Right)
|
||||
{
|
||||
move(computeRegion(ea), osg::Vec2d(_keyIncrement.x()*incrementScale(ea).x(), 0.0) );
|
||||
}
|
||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_7 || ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Home)
|
||||
{
|
||||
_currentControlPoints->top_left.set(x, y);
|
||||
}
|
||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_9 || ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Page_Up)
|
||||
{
|
||||
_currentControlPoints->top_right.set(x, y);
|
||||
}
|
||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_3 || ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Page_Down)
|
||||
{
|
||||
_currentControlPoints->bottom_right.set(x, y);
|
||||
}
|
||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_1 || ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_End)
|
||||
{
|
||||
_currentControlPoints->bottom_left.set(x, y);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@ -360,7 +368,7 @@ bool KeystoneHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionA
|
||||
}
|
||||
struct KeystoneCullCallback : public osg::Drawable::CullCallback
|
||||
{
|
||||
KeystoneCullCallback(Keystone* keystone=0):_keystone(keystone) {}
|
||||
KeystoneCullCallback(osg::Keystone* keystone=0):_keystone(keystone) {}
|
||||
KeystoneCullCallback(const KeystoneCullCallback&, const osg::CopyOp&) {}
|
||||
|
||||
META_Object(osg,KeystoneCullCallback);
|
||||
@ -371,13 +379,13 @@ struct KeystoneCullCallback : public osg::Drawable::CullCallback
|
||||
return _keystone.valid() ? !_keystone->keystoneEditingEnabled : true;
|
||||
}
|
||||
|
||||
osg::ref_ptr<Keystone> _keystone;
|
||||
osg::ref_ptr<osg::Keystone> _keystone;
|
||||
};
|
||||
|
||||
|
||||
struct KeystoneUpdateCallback : public osg::Drawable::UpdateCallback
|
||||
{
|
||||
KeystoneUpdateCallback(Keystone* keystone=0):_keystone(keystone) {}
|
||||
KeystoneUpdateCallback(osg::Keystone* keystone=0):_keystone(keystone) {}
|
||||
KeystoneUpdateCallback(const KeystoneUpdateCallback&, const osg::CopyOp&) {}
|
||||
|
||||
META_Object(osg,KeystoneUpdateCallback);
|
||||
@ -414,11 +422,11 @@ struct KeystoneUpdateCallback : public osg::Drawable::UpdateCallback
|
||||
geometry->dirtyBound();
|
||||
}
|
||||
|
||||
osg::ref_ptr<Keystone> _keystone;
|
||||
osg::ref_ptr<osg::Keystone> _keystone;
|
||||
};
|
||||
|
||||
|
||||
osg::Geode* createKeystoneDistortionMesh(Keystone* keystone)
|
||||
osg::Geode* createKeystoneDistortionMesh(osg::Keystone* keystone)
|
||||
{
|
||||
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
|
||||
|
||||
@ -483,7 +491,7 @@ osg::Geode* createKeystoneDistortionMesh(Keystone* keystone)
|
||||
return geode.release();
|
||||
}
|
||||
|
||||
osg::Node* createGrid(Keystone* keystone, const osg::Vec4& colour)
|
||||
osg::Node* createGrid(osg::Keystone* keystone, const osg::Vec4& colour)
|
||||
{
|
||||
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
|
||||
|
||||
@ -623,7 +631,7 @@ osg::Camera* assignKeystoneRenderToTextureCamera(osgViewer::View* view, osg::Gra
|
||||
return camera.release();
|
||||
}
|
||||
|
||||
osg::Camera* assignKeystoneDistortionCamera(osgViewer::View* view, osg::DisplaySettings* ds, osg::GraphicsContext* gc, int x, int y, int width, int height, GLenum buffer, osg::Texture* texture, Keystone* keystone)
|
||||
osg::Camera* assignKeystoneDistortionCamera(osgViewer::View* view, osg::DisplaySettings* ds, osg::GraphicsContext* gc, int x, int y, int width, int height, GLenum buffer, osg::Texture* texture, osg::Keystone* keystone)
|
||||
{
|
||||
double screenDistance = ds->getScreenDistance();
|
||||
double screenWidth = ds->getScreenWidth();
|
||||
@ -845,7 +853,7 @@ void setUpViewForStereo(osgViewer::View* view, osg::DisplaySettings* ds)
|
||||
ds->setUseSceneViewForStereoHint(false);
|
||||
|
||||
|
||||
osg::ref_ptr<Keystone> keystone = new Keystone;
|
||||
osg::ref_ptr<osg::Keystone> keystone = new osg::Keystone;
|
||||
|
||||
|
||||
// set up view's main camera
|
||||
@ -1114,7 +1122,7 @@ void setUpViewForStereo(osgViewer::View* view, osg::DisplaySettings* ds)
|
||||
left_keystone_camera->addEventCallback(new KeystoneHandler(keystone.get()));
|
||||
|
||||
|
||||
osg::ref_ptr<Keystone> right_keystone = new Keystone;
|
||||
osg::ref_ptr<osg::Keystone> right_keystone = new osg::Keystone;
|
||||
right_keystone->gridColour.set(0.0f,1.0f,0.0,1.0);
|
||||
|
||||
// create Keystone right distortion camera
|
||||
@ -1207,7 +1215,7 @@ void setUpViewForStereo(osgViewer::View* view, osg::DisplaySettings* ds)
|
||||
left_keystone_camera->addEventCallback(new KeystoneHandler(keystone.get()));
|
||||
|
||||
|
||||
osg::ref_ptr<Keystone> right_keystone = new Keystone;
|
||||
osg::ref_ptr<osg::Keystone> right_keystone = new osg::Keystone;
|
||||
right_keystone->gridColour.set(0.0f,1.0f,0.0,1.0);
|
||||
|
||||
// create Keystone right distortion camera
|
||||
@ -1399,7 +1407,7 @@ void setUpViewForStereo(osgViewer::View* view, osg::DisplaySettings* ds)
|
||||
}
|
||||
|
||||
|
||||
void setUpViewForKeystone(osgViewer::View* view, Keystone* keystone)
|
||||
void setUpViewForKeystone(osgViewer::View* view, osg::Keystone* keystone)
|
||||
{
|
||||
int screenNum = 0;
|
||||
|
||||
@ -1501,7 +1509,7 @@ int main( int argc, char **argv )
|
||||
}
|
||||
else
|
||||
{
|
||||
setUpViewForKeystone(&viewer, new Keystone);
|
||||
setUpViewForKeystone(&viewer, new osg::Keystone);
|
||||
}
|
||||
|
||||
viewer.realize();
|
||||
|
Loading…
Reference in New Issue
Block a user