Fixed the handling the mouse min/max ranges of slave Cameras that have a parent Camera with a viewport.

This commit is contained in:
Robert Osfield
2013-06-20 16:44:14 +00:00
parent a2b2ba5860
commit 715dd4e930
3 changed files with 28 additions and 8 deletions

View File

@@ -747,10 +747,19 @@ void CompositeViewer::generateSlavePointerData(osg::Camera* camera, osgGA::GUIEv
bool invert_y = event.getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS;
if (invert_y && gw->getTraits()) y = gw->getTraits()->height - y;
double master_min_x = -1.0;
double master_max_x = 1.0;
double master_min_y = -1.0;
double master_max_y = 1.0;
osg::Matrix masterCameraVPW = view_masterCamera->getViewMatrix() * view_masterCamera->getProjectionMatrix();
if (view_masterCamera->getViewport())
{
osg::Viewport* viewport = view_masterCamera->getViewport();
master_min_x = viewport->x();
master_min_y = viewport->y();
master_max_x = viewport->x()+viewport->width();
master_max_y = viewport->y()+viewport->height();
masterCameraVPW *= viewport->computeWindowMatrix();
}
@@ -767,8 +776,8 @@ void CompositeViewer::generateSlavePointerData(osg::Camera* camera, osgGA::GUIEv
osg::Matrix matrix( osg::Matrix::inverse(localCameraVPW) * masterCameraVPW );
osg::Vec3d new_coord = osg::Vec3d(x,y,0.0) * matrix;
//OSG_NOTICE<<" pointer event new_coord.x()="<<new_coord.x()<<" new_coord.y()="<<new_coord.y()<<std::endl;
event.addPointerData(new osgGA::PointerData(view_masterCamera, new_coord.x(), -1.0, 1.0,
new_coord.y(), -1.0, 1.0));
event.addPointerData(new osgGA::PointerData(view_masterCamera, new_coord.x(), master_min_x, master_max_x,
new_coord.y(), master_min_y, master_max_y));
}
else if (!slave->_useMastersSceneData)
{

View File

@@ -674,14 +674,23 @@ void Viewer::generateSlavePointerData(osg::Camera* camera, osgGA::GUIEventAdapte
bool invert_y = event.getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS;
if (invert_y && gw->getTraits()) y = gw->getTraits()->height - y;
double master_min_x = -1.0;
double master_max_x = 1.0;
double master_min_y = -1.0;
double master_max_y = 1.0;
osg::Matrix masterCameraVPW = getCamera()->getViewMatrix() * getCamera()->getProjectionMatrix();
if (getCamera()->getViewport())
{
osg::Viewport* viewport = getCamera()->getViewport();
master_min_x = viewport->x();
master_min_y = viewport->y();
master_max_x = viewport->x()+viewport->width();
master_max_y = viewport->y()+viewport->height();
masterCameraVPW *= viewport->computeWindowMatrix();
}
// slave Camera tahnks to sharing the same View
// slave Camera if it shares the same View
osg::View::Slave* slave = findSlaveForCamera(camera);
if (slave)
{
@@ -689,13 +698,15 @@ void Viewer::generateSlavePointerData(osg::Camera* camera, osgGA::GUIEventAdapte
{
osg::Viewport* viewport = camera->getViewport();
osg::Matrix localCameraVPW = camera->getViewMatrix() * camera->getProjectionMatrix();
if (viewport) localCameraVPW *= viewport->computeWindowMatrix();
if (viewport)
{
localCameraVPW *= viewport->computeWindowMatrix();
}
osg::Matrix matrix( osg::Matrix::inverse(localCameraVPW) * masterCameraVPW );
osg::Vec3d new_coord = osg::Vec3d(x,y,0.0) * matrix;
//OSG_NOTICE<<" pointer event new_coord.x()="<<new_coord.x()<<" new_coord.y()="<<new_coord.y()<<std::endl;
event.addPointerData(new osgGA::PointerData(getCamera(), new_coord.x(), -1.0, 1.0,
new_coord.y(), -1.0, 1.0));
event.addPointerData(new osgGA::PointerData(getCamera(), new_coord.x(), master_min_x, master_max_x,
new_coord.y(), master_min_y, master_max_y));
}
else if (!slave->_useMastersSceneData)
{

View File

@@ -114,6 +114,6 @@ void SingleWindow::configure(osgViewer::View& view) const
}
else if (ds->getStereo() && ds->getUseSceneViewForStereoHint())
{
//view.assignStereoOrKeystoneToCamera(view.getCamera(), ds);
view.assignStereoOrKeystoneToCamera(view.getCamera(), ds);
}
}