Removed old experimental keystone code to clean up the example
This commit is contained in:
parent
18d14065a5
commit
830d21471b
@ -28,10 +28,10 @@
|
|||||||
#include <osgViewer/ViewerEventHandlers>
|
#include <osgViewer/ViewerEventHandlers>
|
||||||
|
|
||||||
|
|
||||||
class ControlPoints : public osg::Referenced
|
class Keystone : public osg::Referenced
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ControlPoints():
|
Keystone():
|
||||||
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),
|
||||||
@ -45,7 +45,7 @@ public:
|
|||||||
top_right.set(1.0,1.0);
|
top_right.set(1.0,1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
ControlPoints& operator = (const ControlPoints& rhs)
|
Keystone& operator = (const Keystone& rhs)
|
||||||
{
|
{
|
||||||
if (&rhs==this) return *this;
|
if (&rhs==this) return *this;
|
||||||
bottom_left = rhs.bottom_left;
|
bottom_left = rhs.bottom_left;
|
||||||
@ -61,141 +61,6 @@ public:
|
|||||||
osg::Vec2d top_right;
|
osg::Vec2d top_right;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Keystone : public osg::Referenced
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Keystone():
|
|
||||||
translate(0.0,0.0),
|
|
||||||
shear(0.0,0.0),
|
|
||||||
scale(1.0,1.0),
|
|
||||||
taper(1.0,1.0),
|
|
||||||
angle(0.0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
double angleBetweenVectors(const osg::Vec2d& v1, const osg::Vec2d& v2) const
|
|
||||||
{
|
|
||||||
osg::Vec2d v3(-v2.y(), v2.x());
|
|
||||||
double p1 = v1*v2;
|
|
||||||
double p2 = v1*v3;
|
|
||||||
double a = atan2(p2, p1);
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
osg::Vec2d rotateVector(osg::Vec2d& v, double s, double c) const
|
|
||||||
{
|
|
||||||
return osg::Vec2d(v.x()*c-v.y()*s, v.y()*c+v.x()*s);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void updateKeystone(ControlPoints cp)
|
|
||||||
{
|
|
||||||
controlPoints = cp;
|
|
||||||
|
|
||||||
// compute translation
|
|
||||||
translate = (cp.bottom_left+cp.bottom_right+cp.top_left+cp.top_right)*0.25;
|
|
||||||
|
|
||||||
// adjust control points to fit translation
|
|
||||||
cp.top_left -= translate;
|
|
||||||
cp.top_right -= translate;
|
|
||||||
cp.bottom_right -= translate;
|
|
||||||
cp.bottom_left -= translate;
|
|
||||||
|
|
||||||
osg::Vec2d mid_left = (cp.top_left+cp.bottom_left)*0.5;
|
|
||||||
osg::Vec2d mid_right = (cp.top_right+cp.bottom_right)*0.5;
|
|
||||||
osg::Vec2d mid_top = (cp.top_left+cp.top_right)*0.5;
|
|
||||||
osg::Vec2d mid_bottom = (cp.bottom_left+cp.bottom_right)*0.5;
|
|
||||||
shear.x() = (mid_top.x()-mid_bottom.x())/(mid_top.y()-mid_bottom.y());
|
|
||||||
shear.y() = (mid_right.y()-mid_left.y())/(mid_right.x()-mid_left.x());
|
|
||||||
|
|
||||||
cp.top_left.x() += cp.top_left.y() * shear.x();
|
|
||||||
cp.top_left.y() += cp.top_left.x() * shear.y();
|
|
||||||
cp.top_right.x() += cp.top_right.y() * shear.x();
|
|
||||||
cp.top_right.y() += cp.top_right.x() * shear.y();
|
|
||||||
cp.bottom_left.x() += cp.bottom_left.y() * shear.x();
|
|
||||||
cp.bottom_left.y() += cp.bottom_left.x() * shear.y();
|
|
||||||
cp.bottom_right.x() += cp.bottom_right.y() * shear.x();
|
|
||||||
cp.bottom_right.y() += cp.bottom_right.x() * shear.y();
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
angle = (angleBetweenVectors(cp.top_left, osg::Vec2d(-1.0,1.0)) +
|
|
||||||
angleBetweenVectors(cp.top_right, osg::Vec2d(1.0,1.0)) +
|
|
||||||
angleBetweenVectors(cp.bottom_right, osg::Vec2d(1.0,-1.0)) +
|
|
||||||
angleBetweenVectors(cp.bottom_left, osg::Vec2d(-1.0,-1.0)))*0.25;
|
|
||||||
#endif
|
|
||||||
OSG_NOTICE<<"cp.top_left="<<cp.top_left<<std::endl;
|
|
||||||
OSG_NOTICE<<"cp.top_right="<<cp.top_right<<std::endl;
|
|
||||||
OSG_NOTICE<<"cp.bottom_right="<<cp.bottom_right<<std::endl;
|
|
||||||
OSG_NOTICE<<"cp.bottom_left="<<cp.bottom_left<<std::endl;
|
|
||||||
|
|
||||||
double s = sin(angle);
|
|
||||||
double c = cos(angle);
|
|
||||||
cp.top_left = rotateVector(cp.top_left, s, c);
|
|
||||||
cp.top_right = rotateVector(cp.top_right, s, c);
|
|
||||||
cp.bottom_right = rotateVector(cp.bottom_right, s, c);
|
|
||||||
cp.bottom_left = rotateVector(cp.bottom_left, s, c);
|
|
||||||
|
|
||||||
OSG_NOTICE<<"after rotate cp.top_left="<<cp.top_left<<std::endl;
|
|
||||||
OSG_NOTICE<<" cp.top_right="<<cp.top_right<<std::endl;
|
|
||||||
OSG_NOTICE<<" cp.bottom_right="<<cp.bottom_right<<std::endl;
|
|
||||||
OSG_NOTICE<<" cp.bottom_left="<<cp.bottom_left<<std::endl;
|
|
||||||
|
|
||||||
|
|
||||||
// compute scaling
|
|
||||||
scale.x() = 1.0; // ( (cp.top_right.x()-cp.top_left.x()) + (cp.bottom_right.x()-cp.bottom_left.x()) )/4.0;
|
|
||||||
scale.y() = 1.0; //( (cp.top_right.y()-cp.bottom_right.y()) + (cp.top_left.y()-cp.bottom_left.y()) )/4.0;
|
|
||||||
|
|
||||||
// adjust control points to fit scaling
|
|
||||||
cp.top_left.x() *= scale.x();
|
|
||||||
cp.top_right.x() *= scale.x();
|
|
||||||
cp.bottom_right.x() *= scale.x();
|
|
||||||
cp.bottom_left.x() *= scale.x();
|
|
||||||
cp.top_left.y() *= scale.y();
|
|
||||||
cp.top_right.y() *= scale.y();
|
|
||||||
cp.bottom_right.y() *= scale.y();
|
|
||||||
cp.bottom_left.y() *= scale.y();
|
|
||||||
|
|
||||||
taper.x() = (cp.top_left-cp.bottom_left).length() / (cp.top_right-cp.bottom_right).length();
|
|
||||||
taper.y() = (cp.bottom_right-cp.bottom_left).length() / (cp.top_right-cp.top_left).length();
|
|
||||||
OSG_NOTICE<<"translate="<<translate<<std::endl;
|
|
||||||
OSG_NOTICE<<"scale="<<scale<<std::endl;
|
|
||||||
OSG_NOTICE<<"taper="<<taper<<std::endl;
|
|
||||||
OSG_NOTICE<<"angle="<<osg::RadiansToDegrees(angle)<<std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
osg::Matrixd computeKeystoneMatrix() const
|
|
||||||
{
|
|
||||||
osg::Matrixd pm;
|
|
||||||
pm.postMultRotate(osg::Quat(angle, osg::Vec3d(0.0,0.0,1.0)));
|
|
||||||
pm.postMultScale(osg::Vec3d(scale.x(),scale.y(),1.0));
|
|
||||||
pm.postMultTranslate(osg::Vec3d(translate.x(),translate.y(),0.0));
|
|
||||||
|
|
||||||
if (taper.x()!=1.0)
|
|
||||||
{
|
|
||||||
double x0 = (1.0+taper.x())/(1-taper.x());
|
|
||||||
pm.postMult(osg::Matrixd(1.0-x0, 0.0, 0.0, 1.0,
|
|
||||||
0.0, 1.0-x0, 0.0, 0.0,
|
|
||||||
0.0, 0.0, (1.0-x0)*0.25, 0.0,
|
|
||||||
0.0, 0.0, 0.0, -x0));
|
|
||||||
}
|
|
||||||
if (taper.y()!=1.0)
|
|
||||||
{
|
|
||||||
double y0 = (1.0+taper.y())/(1-taper.y());
|
|
||||||
pm.postMult(osg::Matrixd(1.0-y0, 0.0, 0.0, 0.0,
|
|
||||||
0.0, 1.0-y0, 0.0, 1.0,
|
|
||||||
0.0, 0.0, (1.0-y0)*0.25, 0.0,
|
|
||||||
0.0, 0.0, 0.0, -y0));
|
|
||||||
}
|
|
||||||
return pm;
|
|
||||||
}
|
|
||||||
|
|
||||||
ControlPoints controlPoints;
|
|
||||||
osg::Vec2d translate;
|
|
||||||
osg::Vec2d shear;
|
|
||||||
osg::Vec2d scale;
|
|
||||||
osg::Vec2d taper;
|
|
||||||
double angle;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class KeystoneHandler : public osgGA::GUIEventHandler
|
class KeystoneHandler : public osgGA::GUIEventHandler
|
||||||
@ -237,10 +102,10 @@ protected:
|
|||||||
osg::Vec2d _keyIncrement;
|
osg::Vec2d _keyIncrement;
|
||||||
|
|
||||||
osg::Vec2d _startPosition;
|
osg::Vec2d _startPosition;
|
||||||
osg::ref_ptr<ControlPoints> _startControlPoints;
|
osg::ref_ptr<Keystone> _startControlPoints;
|
||||||
|
|
||||||
Region _selectedRegion;
|
Region _selectedRegion;
|
||||||
osg::ref_ptr<ControlPoints> _currentControlPoints;
|
osg::ref_ptr<Keystone> _currentControlPoints;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -252,8 +117,8 @@ KeystoneHandler::KeystoneHandler(Keystone* keystone):
|
|||||||
_keyIncrement(0.005, 0.005),
|
_keyIncrement(0.005, 0.005),
|
||||||
_selectedRegion(NONE_SELECTED)
|
_selectedRegion(NONE_SELECTED)
|
||||||
{
|
{
|
||||||
_startControlPoints = new ControlPoints;
|
_startControlPoints = new Keystone;
|
||||||
_currentControlPoints = new ControlPoints;
|
_currentControlPoints = keystone; //new Keystone;
|
||||||
}
|
}
|
||||||
|
|
||||||
KeystoneHandler::Region KeystoneHandler::computeRegion(const osgGA::GUIEventAdapter& ea) const
|
KeystoneHandler::Region KeystoneHandler::computeRegion(const osgGA::GUIEventAdapter& ea) const
|
||||||
@ -325,7 +190,6 @@ void KeystoneHandler::move(Region region, const osg::Vec2d& delta)
|
|||||||
case(NONE_SELECTED):
|
case(NONE_SELECTED):
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
_keystone->updateKeystone(*_currentControlPoints);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
osg::Vec2d KeystoneHandler::incrementScale(const osgGA::GUIEventAdapter& ea) const
|
osg::Vec2d KeystoneHandler::incrementScale(const osgGA::GUIEventAdapter& ea) const
|
||||||
@ -380,7 +244,6 @@ bool KeystoneHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionA
|
|||||||
_selectedRegion = NONE_SELECTED;
|
_selectedRegion = NONE_SELECTED;
|
||||||
_startControlPoints->reset();
|
_startControlPoints->reset();
|
||||||
_currentControlPoints->reset();
|
_currentControlPoints->reset();
|
||||||
_keystone->updateKeystone(*_currentControlPoints);
|
|
||||||
}
|
}
|
||||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Up)
|
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Up)
|
||||||
{
|
{
|
||||||
@ -401,22 +264,18 @@ bool KeystoneHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionA
|
|||||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_7 || ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Home)
|
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_7 || ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Home)
|
||||||
{
|
{
|
||||||
_currentControlPoints->top_left.set(ea.getXnormalized(), ea.getYnormalized());
|
_currentControlPoints->top_left.set(ea.getXnormalized(), ea.getYnormalized());
|
||||||
_keystone->updateKeystone(*_currentControlPoints);
|
|
||||||
}
|
}
|
||||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_9 || ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Page_Up)
|
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_9 || ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Page_Up)
|
||||||
{
|
{
|
||||||
_currentControlPoints->top_right.set(ea.getXnormalized(), ea.getYnormalized());
|
_currentControlPoints->top_right.set(ea.getXnormalized(), ea.getYnormalized());
|
||||||
_keystone->updateKeystone(*_currentControlPoints);
|
|
||||||
}
|
}
|
||||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_3 || ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Page_Down)
|
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_3 || ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Page_Down)
|
||||||
{
|
{
|
||||||
_currentControlPoints->bottom_right.set(ea.getXnormalized(), ea.getYnormalized());
|
_currentControlPoints->bottom_right.set(ea.getXnormalized(), ea.getYnormalized());
|
||||||
_keystone->updateKeystone(*_currentControlPoints);
|
|
||||||
}
|
}
|
||||||
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_1 || ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_End)
|
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_1 || ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_End)
|
||||||
{
|
{
|
||||||
_currentControlPoints->bottom_left.set(ea.getXnormalized(), ea.getYnormalized());
|
_currentControlPoints->bottom_left.set(ea.getXnormalized(), ea.getYnormalized());
|
||||||
_keystone->updateKeystone(*_currentControlPoints);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -522,11 +381,11 @@ struct KeystoneUpdateCallback : public osg::Drawable::UpdateCallback
|
|||||||
if (!vertices) return;
|
if (!vertices) return;
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
double tr_x = ((_keystone->controlPoints.top_right-_keystone->controlPoints.bottom_right).length()) / ((_keystone->controlPoints.top_left-_keystone->controlPoints.bottom_left).length());
|
double tr_x = ((_keystone->top_right-_keystone->bottom_right).length()) / ((_keystone->top_left-_keystone->bottom_left).length());
|
||||||
double r_left = sqrt(tr_x);
|
double r_left = sqrt(tr_x);
|
||||||
double r_right = r_left/tr_x;
|
double r_right = r_left/tr_x;
|
||||||
|
|
||||||
double tr_y = ((_keystone->controlPoints.top_right-_keystone->controlPoints.top_left).length()) / ((_keystone->controlPoints.bottom_right-_keystone->controlPoints.bottom_left).length());
|
double tr_y = ((_keystone->top_right-_keystone->top_left).length()) / ((_keystone->bottom_right-_keystone->bottom_left).length());
|
||||||
double r_bottom = sqrt(tr_y);
|
double r_bottom = sqrt(tr_y);
|
||||||
double r_top = r_bottom/tr_y;
|
double r_top = r_bottom/tr_y;
|
||||||
|
|
||||||
@ -534,10 +393,10 @@ struct KeystoneUpdateCallback : public osg::Drawable::UpdateCallback
|
|||||||
double screenWidth = osg::DisplaySettings::instance()->getScreenWidth();
|
double screenWidth = osg::DisplaySettings::instance()->getScreenWidth();
|
||||||
double screenHeight = osg::DisplaySettings::instance()->getScreenHeight();
|
double screenHeight = osg::DisplaySettings::instance()->getScreenHeight();
|
||||||
|
|
||||||
(*vertices)[0] = osg::Vec3(screenWidth*0.5*_keystone->controlPoints.top_left.x(), screenHeight*0.5*_keystone->controlPoints.top_left.y(), -screenDistance)*r_left*r_top;
|
(*vertices)[0] = osg::Vec3(screenWidth*0.5*_keystone->top_left.x(), screenHeight*0.5*_keystone->top_left.y(), -screenDistance)*r_left*r_top;
|
||||||
(*vertices)[1] = osg::Vec3(screenWidth*0.5*_keystone->controlPoints.top_right.x(), screenHeight*0.5*_keystone->controlPoints.top_right.y(), -screenDistance)*r_right*r_top;
|
(*vertices)[1] = osg::Vec3(screenWidth*0.5*_keystone->top_right.x(), screenHeight*0.5*_keystone->top_right.y(), -screenDistance)*r_right*r_top;
|
||||||
(*vertices)[2] = osg::Vec3(screenWidth*0.5*_keystone->controlPoints.bottom_right.x(), screenHeight*0.5*_keystone->controlPoints.bottom_right.y(), -screenDistance)*r_right*r_bottom;
|
(*vertices)[2] = osg::Vec3(screenWidth*0.5*_keystone->bottom_right.x(), screenHeight*0.5*_keystone->bottom_right.y(), -screenDistance)*r_right*r_bottom;
|
||||||
(*vertices)[3] = osg::Vec3(screenWidth*0.5*_keystone->controlPoints.bottom_left.x(), screenHeight*0.5*_keystone->controlPoints.bottom_left.y(), -screenDistance)*r_left*r_bottom;
|
(*vertices)[3] = osg::Vec3(screenWidth*0.5*_keystone->bottom_left.x(), screenHeight*0.5*_keystone->bottom_left.y(), -screenDistance)*r_left*r_bottom;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
double screenDistance = osg::DisplaySettings::instance()->getScreenDistance();
|
double screenDistance = osg::DisplaySettings::instance()->getScreenDistance();
|
||||||
@ -753,23 +612,6 @@ int main( int argc, char **argv )
|
|||||||
|
|
||||||
osg::ref_ptr<Keystone> keystone = new Keystone;
|
osg::ref_ptr<Keystone> keystone = new Keystone;
|
||||||
|
|
||||||
double distance, width, view_angle;
|
|
||||||
if (arguments.read("-p",distance, width, view_angle))
|
|
||||||
{
|
|
||||||
keystone->taper.x() = (2.0 + (width/distance) * sin(osg::inDegrees(view_angle))) / (2.0 - (width/distance) * sin(osg::inDegrees(view_angle)));
|
|
||||||
//scale.x() = 1.0/cos(osg::inDegrees(view_angle));
|
|
||||||
OSG_NOTICE<<"scale "<<keystone->scale<<std::endl;
|
|
||||||
OSG_NOTICE<<"taper "<<keystone->taper<<std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (arguments.read("-a",keystone->angle)) { OSG_NOTICE<<"angle = "<<keystone->angle<<std::endl; keystone->angle = osg::inDegrees(keystone->angle); }
|
|
||||||
if (arguments.read("-t",keystone->translate.x(), keystone->translate.y())) { OSG_NOTICE<<"translate = "<<keystone->translate<<std::endl;}
|
|
||||||
if (arguments.read("-s",keystone->scale.x(), keystone->scale.y())) { OSG_NOTICE<<"scale = "<<keystone->scale<<std::endl;}
|
|
||||||
if (arguments.read("-k",keystone->taper.x(), keystone->taper.y())) { OSG_NOTICE<<"taper = "<<keystone->taper<<std::endl;}
|
|
||||||
|
|
||||||
bool oldStyleKeystone = false;
|
|
||||||
if (arguments.read("--old")) oldStyleKeystone = true;
|
|
||||||
|
|
||||||
osg::ref_ptr<osg::Node> model = osgDB::readNodeFiles(arguments);
|
osg::ref_ptr<osg::Node> model = osgDB::readNodeFiles(arguments);
|
||||||
|
|
||||||
if (!model)
|
if (!model)
|
||||||
@ -806,11 +648,7 @@ int main( int argc, char **argv )
|
|||||||
// add camera manipulator
|
// add camera manipulator
|
||||||
viewer.setCameraManipulator(new osgGA::TrackballManipulator());
|
viewer.setCameraManipulator(new osgGA::TrackballManipulator());
|
||||||
|
|
||||||
|
setUpViewForKeystone(&viewer, keystone);
|
||||||
if (!oldStyleKeystone)
|
|
||||||
{
|
|
||||||
setUpViewForKeystone(&viewer, keystone);
|
|
||||||
}
|
|
||||||
|
|
||||||
viewer.realize();
|
viewer.realize();
|
||||||
|
|
||||||
@ -829,12 +667,6 @@ int main( int argc, char **argv )
|
|||||||
viewer.advance();
|
viewer.advance();
|
||||||
viewer.eventTraversal();
|
viewer.eventTraversal();
|
||||||
viewer.updateTraversal();
|
viewer.updateTraversal();
|
||||||
|
|
||||||
if (oldStyleKeystone && keystone.valid())
|
|
||||||
{
|
|
||||||
viewer.getCamera()->setProjectionMatrix(original_pm * keystone->computeKeystoneMatrix());
|
|
||||||
camera->setProjectionMatrix(original_grid_pm * keystone->computeKeystoneMatrix());
|
|
||||||
}
|
|
||||||
viewer.renderingTraversals();
|
viewer.renderingTraversals();
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user