Various work on osgViewer library, including warp point and graphics window resize support
This commit is contained in:
@@ -88,6 +88,141 @@ class GraphicsContextX11 : public osg::GraphicsContext
|
||||
|
||||
}
|
||||
|
||||
class X11KeyboardMap
|
||||
{
|
||||
public:
|
||||
|
||||
X11KeyboardMap()
|
||||
{
|
||||
_keymap[XK_Escape ] = osgGA::GUIEventAdapter::KEY_Escape;
|
||||
_keymap[XK_F1 ] = osgGA::GUIEventAdapter::KEY_F1;
|
||||
_keymap[XK_F2 ] = osgGA::GUIEventAdapter::KEY_F2;
|
||||
_keymap[XK_F3 ] = osgGA::GUIEventAdapter::KEY_F3;
|
||||
_keymap[XK_F4 ] = osgGA::GUIEventAdapter::KEY_F4;
|
||||
_keymap[XK_F5 ] = osgGA::GUIEventAdapter::KEY_F5;
|
||||
_keymap[XK_F6 ] = osgGA::GUIEventAdapter::KEY_F6;
|
||||
_keymap[XK_F7 ] = osgGA::GUIEventAdapter::KEY_F7;
|
||||
_keymap[XK_F8 ] = osgGA::GUIEventAdapter::KEY_F8;
|
||||
_keymap[XK_F9 ] = osgGA::GUIEventAdapter::KEY_F9;
|
||||
_keymap[XK_F10 ] = osgGA::GUIEventAdapter::KEY_F10;
|
||||
_keymap[XK_F11 ] = osgGA::GUIEventAdapter::KEY_F11;
|
||||
_keymap[XK_F12 ] = osgGA::GUIEventAdapter::KEY_F12;
|
||||
_keymap[XK_quoteleft ] = '"';
|
||||
_keymap[XK_1 ] = '1';
|
||||
_keymap[XK_2 ] = '2';
|
||||
_keymap[XK_3 ] = '3';
|
||||
_keymap[XK_4 ] = '4';
|
||||
_keymap[XK_5 ] = '5';
|
||||
_keymap[XK_6 ] = '6';
|
||||
_keymap[XK_7 ] = '7';
|
||||
_keymap[XK_8 ] = '8';
|
||||
_keymap[XK_9 ] = '9';
|
||||
_keymap[XK_0 ] = '0';
|
||||
_keymap[XK_minus ] = '-';
|
||||
_keymap[XK_equal ] = '=';
|
||||
_keymap[XK_BackSpace ] = osgGA::GUIEventAdapter::KEY_BackSpace;
|
||||
_keymap[XK_Tab ] = osgGA::GUIEventAdapter::KEY_Tab;
|
||||
_keymap[XK_a ] = 'A';
|
||||
_keymap[XK_b ] = 'B';
|
||||
_keymap[XK_c ] = 'C';
|
||||
_keymap[XK_d ] = 'D';
|
||||
_keymap[XK_e ] = 'E';
|
||||
_keymap[XK_f ] = 'F';
|
||||
_keymap[XK_g ] = 'G';
|
||||
_keymap[XK_h ] = 'H';
|
||||
_keymap[XK_i ] = 'I';
|
||||
_keymap[XK_j ] = 'J';
|
||||
_keymap[XK_k ] = 'K';
|
||||
_keymap[XK_l ] = 'L';
|
||||
_keymap[XK_m ] = 'M';
|
||||
_keymap[XK_n ] = 'N';
|
||||
_keymap[XK_o ] = 'O';
|
||||
_keymap[XK_p ] = 'P';
|
||||
_keymap[XK_q ] = 'Q';
|
||||
_keymap[XK_r ] = 'R';
|
||||
_keymap[XK_s ] = 'S';
|
||||
_keymap[XK_t ] = 'T';
|
||||
_keymap[XK_u ] = 'U';
|
||||
_keymap[XK_v ] = 'V';
|
||||
_keymap[XK_w ] = 'W';
|
||||
_keymap[XK_x ] = 'X';
|
||||
_keymap[XK_y ] = 'Y';
|
||||
_keymap[XK_z ] = 'Z';
|
||||
_keymap[XK_bracketleft ] = '(';
|
||||
_keymap[XK_bracketright ] = ')';
|
||||
_keymap[XK_backslash ] = '\\';
|
||||
_keymap[XK_Caps_Lock ] = osgGA::GUIEventAdapter::KEY_Caps_Lock;
|
||||
_keymap[XK_semicolon ] = ';';
|
||||
_keymap[XK_apostrophe ] = '\'';
|
||||
_keymap[XK_Return ] = osgGA::GUIEventAdapter::KEY_Return;
|
||||
_keymap[XK_Shift_L ] = osgGA::GUIEventAdapter::KEY_Shift_L;
|
||||
_keymap[XK_comma ] = ',';
|
||||
_keymap[XK_period ] = '.';
|
||||
_keymap[XK_slash ] = '/';
|
||||
_keymap[XK_Shift_R ] = osgGA::GUIEventAdapter::KEY_Shift_R;
|
||||
_keymap[XK_Control_L ] = osgGA::GUIEventAdapter::KEY_Control_L;
|
||||
_keymap[XK_Super_L ] = osgGA::GUIEventAdapter::KEY_Super_L;
|
||||
_keymap[XK_space ] = ' ';
|
||||
_keymap[XK_Alt_L ] = osgGA::GUIEventAdapter::KEY_Alt_L;
|
||||
_keymap[XK_Alt_R ] = osgGA::GUIEventAdapter::KEY_Alt_R;
|
||||
_keymap[XK_Super_R ] = osgGA::GUIEventAdapter::KEY_Super_R;
|
||||
_keymap[XK_Menu ] = osgGA::GUIEventAdapter::KEY_Menu;
|
||||
_keymap[XK_Control_R ] = osgGA::GUIEventAdapter::KEY_Control_R;
|
||||
_keymap[XK_Print ] = osgGA::GUIEventAdapter::KEY_Print;
|
||||
_keymap[XK_Scroll_Lock ] = osgGA::GUIEventAdapter::KEY_Scroll_Lock;
|
||||
_keymap[XK_Pause ] = osgGA::GUIEventAdapter::KEY_Pause;
|
||||
_keymap[XK_Home ] = osgGA::GUIEventAdapter::KEY_Home;
|
||||
_keymap[XK_Page_Up ] = osgGA::GUIEventAdapter::KEY_Page_Up;
|
||||
_keymap[XK_End ] = osgGA::GUIEventAdapter::KEY_End;
|
||||
_keymap[XK_Page_Down ] = osgGA::GUIEventAdapter::KEY_Page_Down;
|
||||
_keymap[XK_Delete ] = osgGA::GUIEventAdapter::KEY_Delete;
|
||||
_keymap[XK_Insert ] = osgGA::GUIEventAdapter::KEY_Insert;
|
||||
_keymap[XK_Left ] = osgGA::GUIEventAdapter::KEY_Left;
|
||||
_keymap[XK_Up ] = osgGA::GUIEventAdapter::KEY_Up;
|
||||
_keymap[XK_Right ] = osgGA::GUIEventAdapter::KEY_Right;
|
||||
_keymap[XK_Down ] = osgGA::GUIEventAdapter::KEY_Down;
|
||||
_keymap[XK_Num_Lock ] = osgGA::GUIEventAdapter::KEY_Num_Lock;
|
||||
_keymap[XK_KP_Divide ] = osgGA::GUIEventAdapter::KEY_KP_Divide;
|
||||
_keymap[XK_KP_Multiply ] = osgGA::GUIEventAdapter::KEY_KP_Multiply;
|
||||
_keymap[XK_KP_Subtract ] = osgGA::GUIEventAdapter::KEY_KP_Subtract;
|
||||
_keymap[XK_KP_Add ] = osgGA::GUIEventAdapter::KEY_KP_Add;
|
||||
_keymap[XK_KP_Home ] = osgGA::GUIEventAdapter::KEY_KP_Home;
|
||||
_keymap[XK_KP_Up ] = osgGA::GUIEventAdapter::KEY_KP_Up;
|
||||
_keymap[XK_KP_Page_Up ] = osgGA::GUIEventAdapter::KEY_KP_Page_Up;
|
||||
_keymap[XK_KP_Left ] = osgGA::GUIEventAdapter::KEY_KP_Left;
|
||||
_keymap[XK_KP_Begin ] = osgGA::GUIEventAdapter::KEY_KP_Begin;
|
||||
_keymap[XK_KP_Right ] = osgGA::GUIEventAdapter::KEY_KP_Right;
|
||||
_keymap[XK_KP_End ] = osgGA::GUIEventAdapter::KEY_KP_End;
|
||||
_keymap[XK_KP_Down ] = osgGA::GUIEventAdapter::KEY_KP_Down;
|
||||
_keymap[XK_KP_Page_Down ] = osgGA::GUIEventAdapter::KEY_KP_Page_Down;
|
||||
_keymap[XK_KP_Insert ] = osgGA::GUIEventAdapter::KEY_KP_Insert;
|
||||
_keymap[XK_KP_Delete ] = osgGA::GUIEventAdapter::KEY_KP_Delete;
|
||||
_keymap[XK_KP_Enter ] = osgGA::GUIEventAdapter::KEY_KP_Enter;
|
||||
|
||||
}
|
||||
|
||||
~X11KeyboardMap() {}
|
||||
|
||||
int remapKey(int key)
|
||||
{
|
||||
KeyMap::iterator itr = _keymap.find(key);
|
||||
if (itr == _keymap.end()) return key;
|
||||
else return itr->second;
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
typedef std::map<int, int> KeyMap;
|
||||
KeyMap _keymap;
|
||||
};
|
||||
|
||||
static int remapX11Key(int key)
|
||||
{
|
||||
static X11KeyboardMap s_x11KeyboardMap;
|
||||
return s_x11KeyboardMap.remapKey(key);
|
||||
}
|
||||
|
||||
bool GraphicsWindowX11::createVisualInfo()
|
||||
{
|
||||
typedef std::vector<int> Attributes;
|
||||
@@ -347,9 +482,12 @@ void GraphicsWindowX11::init()
|
||||
|
||||
// now update the window dimensions to account for any size changes made by the window manager,
|
||||
XGetWindowAttributes( _display, _window, &watt );
|
||||
_traits->width = watt.width;
|
||||
_traits->height = watt.height;
|
||||
|
||||
if (_traits->width != watt.width && _traits->height != watt.height)
|
||||
{
|
||||
resized( _traits->x, _traits->y, _traits->width, _traits->height );
|
||||
}
|
||||
|
||||
//osg::notify(osg::NOTICE)<<"After sync apply.x = "<<watt.x<<" watt.y="<<watt.y<<" width="<<watt.width<<" height="<<watt.height<<std::endl;
|
||||
|
||||
_valid = true;
|
||||
@@ -388,7 +526,6 @@ void GraphicsWindowX11::makeCurrentImplementation()
|
||||
// checkEvents();
|
||||
|
||||
glXMakeCurrent( _display, _window, _glxContext );
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -422,8 +559,6 @@ void GraphicsWindowX11::swapBuffersImplementation()
|
||||
|
||||
// osg::notify(osg::NOTICE)<<"swapBuffersImplementation "<<this<<" "<<OpenThreads::Thread::CurrentThread()<<std::endl;
|
||||
|
||||
// makeCurrentImplementation();
|
||||
|
||||
glXSwapBuffers(_display, _window);
|
||||
|
||||
#if 0
|
||||
@@ -437,6 +572,11 @@ void GraphicsWindowX11::checkEvents()
|
||||
{
|
||||
if (!_realized) return;
|
||||
|
||||
int windowX = _traits->x;
|
||||
int windowY = _traits->y;
|
||||
int windowWidth = _traits->width;
|
||||
int windowHeight = _traits->height;
|
||||
|
||||
// osg::notify(osg::NOTICE)<<"Check events"<<std::endl;
|
||||
while( XPending(_display) )
|
||||
{
|
||||
@@ -462,7 +602,7 @@ void GraphicsWindowX11::checkEvents()
|
||||
break;
|
||||
|
||||
case DestroyNotify :
|
||||
osg::notify(osg::INFO)<<"DestroyNotify"<<std::endl;
|
||||
osg::notify(osg::NOTICE)<<"DestroyNotify"<<std::endl;
|
||||
_realized = false;
|
||||
break;
|
||||
|
||||
@@ -470,11 +610,17 @@ void GraphicsWindowX11::checkEvents()
|
||||
{
|
||||
osg::notify(osg::INFO)<<"ConfigureNotify x="<<ev.xconfigure.x<<" y="<<ev.xconfigure.y<<" width="<<ev.xconfigure.width<<", height="<<ev.xconfigure.height<<std::endl;
|
||||
|
||||
_traits->x = ev.xconfigure.x;
|
||||
_traits->y = ev.xconfigure.y;
|
||||
_traits->width = ev.xconfigure.width;
|
||||
_traits->height = ev.xconfigure.height;
|
||||
// need to dispatch resize event.
|
||||
if (windowX != ev.xconfigure.x ||
|
||||
windowX != ev.xconfigure.y ||
|
||||
windowWidth != ev.xconfigure.width ||
|
||||
windowHeight != ev.xconfigure.height)
|
||||
{
|
||||
windowX = ev.xconfigure.x;
|
||||
windowY = ev.xconfigure.y;
|
||||
windowWidth = ev.xconfigure.width;
|
||||
windowHeight = ev.xconfigure.height;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -487,8 +633,16 @@ void GraphicsWindowX11::checkEvents()
|
||||
while( watt.map_state != IsViewable );
|
||||
|
||||
osg::notify(osg::INFO)<<"MapNotify x="<<watt.x<<" y="<<watt.y<<" width="<<watt.width<<", height="<<watt.height<<std::endl;
|
||||
|
||||
if (windowWidth != watt.width || windowHeight != watt.height)
|
||||
{
|
||||
windowWidth = watt.width;
|
||||
windowHeight = watt.height;
|
||||
}
|
||||
|
||||
_traits->width = watt.width;
|
||||
_traits->height = watt.height;
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -620,6 +774,15 @@ void GraphicsWindowX11::checkEvents()
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (windowX != _traits->x ||
|
||||
windowY != _traits->y ||
|
||||
windowWidth != _traits->width ||
|
||||
windowHeight != _traits->height)
|
||||
{
|
||||
resized(windowX, windowY, windowWidth, windowHeight);
|
||||
getEventQueue()->windowResize(windowX, windowY, windowWidth, windowHeight);
|
||||
}
|
||||
}
|
||||
|
||||
void GraphicsWindowX11::grabFocus()
|
||||
@@ -654,8 +817,7 @@ void GraphicsWindowX11::transformMouseXY(float& x, float& y)
|
||||
|
||||
void GraphicsWindowX11::adaptKey(XKeyEvent& keyevent, int& keySymbol, unsigned int& modifierMask)
|
||||
{
|
||||
// KeySym ks = XKeycodeToKeysym( _display, keyevent.keycode, 0 );
|
||||
|
||||
|
||||
static XComposeStatus state;
|
||||
unsigned char keybuf[32];
|
||||
XLookupString( &keyevent, (char *)keybuf, sizeof(keybuf), NULL, &state );
|
||||
@@ -687,6 +849,33 @@ void GraphicsWindowX11::adaptKey(XKeyEvent& keyevent, int& keySymbol, unsigned i
|
||||
}
|
||||
|
||||
keySymbol = keybuf[0];
|
||||
|
||||
KeySym ks = XKeycodeToKeysym( _display, keyevent.keycode, 0 );
|
||||
int remappedKey = remapX11Key(ks);
|
||||
if (remappedKey & 0xff00)
|
||||
{
|
||||
// special keyboard character
|
||||
keySymbol = remappedKey;
|
||||
}
|
||||
else
|
||||
{
|
||||
// normal ascii key
|
||||
keySymbol = keybuf[0];
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void GraphicsWindowX11::requestWarpPointer(float x,float y)
|
||||
{
|
||||
XWarpPointer( _display,
|
||||
None,
|
||||
_window,
|
||||
0, 0, 0, 0,
|
||||
static_cast<int>(x), static_cast<int>(y) );
|
||||
|
||||
XFlush(_display);
|
||||
XSync(_display, 0);
|
||||
}
|
||||
|
||||
struct X11WindowingSystemInterface : public osg::GraphicsContext::WindowingSystemInterface
|
||||
|
||||
@@ -15,20 +15,10 @@
|
||||
#include <osgViewer/GraphicsWindow>
|
||||
|
||||
#include <osgUtil/SceneView>
|
||||
#include <osg/io_utils>
|
||||
|
||||
using namespace osgViewer;
|
||||
|
||||
class ActionAdapter : public osgGA::GUIActionAdapter
|
||||
{
|
||||
public:
|
||||
virtual ~ActionAdapter() {}
|
||||
|
||||
virtual void requestRedraw() { /*osg::notify(osg::NOTICE)<<"requestRedraw()"<<std::endl;*/ }
|
||||
virtual void requestContinuousUpdate(bool /*needed*/=true) { /*osg::notify(osg::NOTICE)<<"requestContinuousUpdate("<<needed<<")"<<std::endl;*/ }
|
||||
virtual void requestWarpPointer(float x,float y) { osg::notify(osg::NOTICE)<<"requestWarpPointer("<<x<<","<<y<<")"<<std::endl; }
|
||||
|
||||
};
|
||||
|
||||
View::View()
|
||||
{
|
||||
// osg::notify(osg::NOTICE)<<"Constructing osgViewer::View"<<std::endl;
|
||||
@@ -57,8 +47,7 @@ void View::setCameraManipulator(osgGA::MatrixManipulator* manipulator)
|
||||
|
||||
osg::ref_ptr<osgGA::GUIEventAdapter> dummyEvent = _eventQueue->createEvent();
|
||||
|
||||
ActionAdapter aa;
|
||||
_cameraManipulator->home(*dummyEvent, aa);
|
||||
_cameraManipulator->home(*dummyEvent, *this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,7 +82,11 @@ void View::setUpViewAcrossAllScreens()
|
||||
traits->y = 0;
|
||||
traits->width = width;
|
||||
traits->height = height;
|
||||
#if 1
|
||||
traits->windowDecoration = false;
|
||||
#else
|
||||
traits->windowDecoration = true;
|
||||
#endif
|
||||
traits->doubleBuffer = true;
|
||||
traits->sharedContext = 0;
|
||||
|
||||
@@ -112,18 +105,18 @@ void View::setUpViewAcrossAllScreens()
|
||||
osg::notify(osg::NOTICE)<<" GraphicsWindow has not been created successfully."<<std::endl;
|
||||
}
|
||||
|
||||
|
||||
_camera->setViewport(new osg::Viewport(0, 0, width, height));
|
||||
|
||||
GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
|
||||
|
||||
_camera->setDrawBuffer(buffer);
|
||||
_camera->setReadBuffer(buffer);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
double rotate_x = - double(numScreens-1) * 0.5 * fovx;
|
||||
|
||||
float inputRangeMinX = 0.0f;
|
||||
float inputRangeMinY = 0.0f;
|
||||
|
||||
float maxHeight = 0.0f;
|
||||
|
||||
|
||||
for(unsigned int i=0; i<numScreens; ++i, rotate_x += fovx)
|
||||
{
|
||||
unsigned int width, height;
|
||||
@@ -150,11 +143,6 @@ void View::setUpViewAcrossAllScreens()
|
||||
osg::notify(osg::INFO)<<" GraphicsWindow has been created successfully."<<gw<<std::endl;
|
||||
|
||||
gw->getEventQueue()->getCurrentEventState()->setWindowRectangle(0, 0, width, height );
|
||||
gw->getEventQueue()->setUseFixedMouseInputRange(true);
|
||||
gw->getEventQueue()->getCurrentEventState()->setInputRange(inputRangeMinX, inputRangeMinY, inputRangeMinX+float(width),inputRangeMinY+float(height) );
|
||||
inputRangeMinX += float(width);
|
||||
|
||||
if (maxHeight < float(height)) maxHeight = float(height);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -163,12 +151,13 @@ void View::setUpViewAcrossAllScreens()
|
||||
|
||||
camera->setViewport(new osg::Viewport(0, 0, width, height));
|
||||
|
||||
GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
|
||||
camera->setDrawBuffer(buffer);
|
||||
camera->setReadBuffer(buffer);
|
||||
|
||||
addSlave(camera.get(), osg::Matrixd(), osg::Matrixd::rotate( rotate_x, 0.0, 1.0, 0.0));
|
||||
|
||||
}
|
||||
|
||||
getEventQueue()->setUseFixedMouseInputRange(true);
|
||||
getEventQueue()->getCurrentEventState()->setInputRange(0.0f, 0.0, inputRangeMinX, maxHeight);
|
||||
}
|
||||
|
||||
setUpRenderingSupport();
|
||||
@@ -190,6 +179,9 @@ struct RenderingOperation : public osg::GraphicsOperation
|
||||
{
|
||||
if (!_sceneView) return;
|
||||
|
||||
|
||||
// osg::notify(osg::NOTICE)<<"RenderingOperation"<<std::endl;
|
||||
|
||||
_sceneView->cull();
|
||||
_sceneView->draw();
|
||||
|
||||
@@ -255,8 +247,7 @@ void View::assignSceneDataToCameras()
|
||||
|
||||
osg::ref_ptr<osgGA::GUIEventAdapter> dummyEvent = _eventQueue->createEvent();
|
||||
|
||||
ActionAdapter aa;
|
||||
_cameraManipulator->home(*dummyEvent, aa);
|
||||
_cameraManipulator->home(*dummyEvent, *this);
|
||||
}
|
||||
|
||||
if (_camera.valid())
|
||||
@@ -275,3 +266,81 @@ void View::assignSceneDataToCameras()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void View::requestRedraw()
|
||||
{
|
||||
}
|
||||
|
||||
void View::requestContinuousUpdate(bool)
|
||||
{
|
||||
}
|
||||
|
||||
void View::requestWarpPointer(float x,float y)
|
||||
{
|
||||
osgGA::GUIEventAdapter* eventState = getEventQueue()->getCurrentEventState();
|
||||
bool view_invert_y = eventState->getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS;
|
||||
|
||||
osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(_camera->getGraphicsContext());
|
||||
if (gw)
|
||||
{
|
||||
bool gw_invert_y = gw->getEventQueue()->getCurrentEventState()->getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS;
|
||||
|
||||
x = x * float(gw->getTraits()->width) / (eventState->getXmax()-eventState->getXmin());
|
||||
y = y * float(gw->getTraits()->height) / (eventState->getYmax()-eventState->getYmin());
|
||||
|
||||
if (view_invert_y != gw_invert_y) y = gw->getTraits()->height - y;
|
||||
|
||||
gw->requestWarpPointer(x, y);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
osg::Matrix masterCameraVPW = getCamera()->getViewMatrix() * getCamera()->getProjectionMatrix();
|
||||
|
||||
x = (x - eventState->getXmin()) * 2.0 / (eventState->getXmax()-eventState->getXmin()) - 1.0;
|
||||
y = (y - eventState->getYmin())* 2.0 / (eventState->getYmax()-eventState->getYmin()) - 1.0;
|
||||
|
||||
if (view_invert_y) y = - y;
|
||||
|
||||
for(unsigned i=0; i<getNumSlaves(); ++i)
|
||||
{
|
||||
Slave& slave = getSlave(i);
|
||||
if (slave._camera.valid())
|
||||
{
|
||||
osg::Camera* camera = slave._camera.get();
|
||||
osg::Viewport* viewport = camera ? camera->getViewport() : 0;
|
||||
|
||||
osg::Matrix localCameraVPW = camera->getViewMatrix() * camera->getProjectionMatrix();
|
||||
if (viewport) localCameraVPW *= viewport->computeWindowMatrix();
|
||||
|
||||
osg::Matrix matrix( osg::Matrix::inverse(masterCameraVPW) * localCameraVPW );
|
||||
|
||||
osg::Vec3d new_coord = osg::Vec3d(x,y,0.0) * matrix;
|
||||
|
||||
if (viewport &&
|
||||
new_coord.x() >= viewport->x() && new_coord.y() >= viewport->y() &&
|
||||
new_coord.x() <= (viewport->x()+viewport->width()) && new_coord.y() <= (viewport->y()+viewport->height()) )
|
||||
{
|
||||
gw = dynamic_cast<osgViewer::GraphicsWindow*>(camera->getGraphicsContext());
|
||||
if (gw)
|
||||
{
|
||||
x = new_coord.x();
|
||||
y = new_coord.y();
|
||||
|
||||
bool gw_invert_y = gw->getEventQueue()->getCurrentEventState()->getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS;
|
||||
|
||||
if (gw_invert_y) y = gw->getTraits()->height - y;
|
||||
|
||||
gw->requestWarpPointer(x, y);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -18,19 +18,10 @@
|
||||
#include <osgUtil/GLObjectsVisitor>
|
||||
#include <osg/GLExtensions>
|
||||
|
||||
#include <osg/io_utils>
|
||||
|
||||
using namespace osgViewer;
|
||||
|
||||
class ActionAdapter : public osgGA::GUIActionAdapter
|
||||
{
|
||||
public:
|
||||
virtual ~ActionAdapter() {}
|
||||
|
||||
virtual void requestRedraw() { /*osg::notify(osg::NOTICE)<<"requestRedraw()"<<std::endl;*/ }
|
||||
virtual void requestContinuousUpdate(bool =true) { /*osg::notify(osg::NOTICE)<<"requestContinuousUpdate("<<needed<<")"<<std::endl;*/ }
|
||||
virtual void requestWarpPointer(float x,float y) { osg::notify(osg::NOTICE)<<"requestWarpPointer("<<x<<","<<y<<")"<<std::endl; }
|
||||
|
||||
};
|
||||
|
||||
Viewer::Viewer():
|
||||
_firstFrame(true),
|
||||
_done(false)
|
||||
@@ -69,8 +60,7 @@ void Viewer::init()
|
||||
|
||||
if (_cameraManipulator.valid())
|
||||
{
|
||||
ActionAdapter aa;
|
||||
_cameraManipulator->init(*initEvent, aa);
|
||||
_cameraManipulator->init(*initEvent, *this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -157,12 +147,14 @@ void Viewer::realize()
|
||||
{
|
||||
osg::notify(osg::INFO)<<"Viewer::realize()"<<std::endl;
|
||||
|
||||
setCameraWithFocus(0);
|
||||
|
||||
Contexts::iterator citr;
|
||||
|
||||
Contexts contexts;
|
||||
getContexts(contexts);
|
||||
|
||||
bool multiThreaded = getNumSlaves() > 1;
|
||||
bool multiThreaded = contexts.size() > 1;
|
||||
|
||||
if (multiThreaded)
|
||||
{
|
||||
@@ -223,7 +215,6 @@ void Viewer::realize()
|
||||
// initialize the global timer to be relative to the current time.
|
||||
osg::Timer::instance()->setStartTick();
|
||||
|
||||
|
||||
if (multiThreaded)
|
||||
{
|
||||
for(citr = contexts.begin();
|
||||
@@ -238,7 +229,6 @@ void Viewer::realize()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -281,6 +271,20 @@ void Viewer::frameEventTraversal()
|
||||
Contexts contexts;
|
||||
getContexts(contexts);
|
||||
|
||||
osgGA::GUIEventAdapter* eventState = getEventQueue()->getCurrentEventState();
|
||||
osg::Matrix masterCameraVPW = getCamera()->getViewMatrix() * getCamera()->getProjectionMatrix();
|
||||
if (getCamera()->getViewport())
|
||||
{
|
||||
osg::Viewport* viewport = getCamera()->getViewport();
|
||||
masterCameraVPW *= viewport->computeWindowMatrix();
|
||||
eventState->setInputRange( viewport->x(), viewport->y(), viewport->x() + viewport->width(), viewport->y() + viewport->height());
|
||||
}
|
||||
else
|
||||
{
|
||||
eventState->setInputRange(-1.0, -1.0, 1.0, 1.0);
|
||||
}
|
||||
|
||||
|
||||
for(Contexts::iterator citr = contexts.begin();
|
||||
citr != contexts.end();
|
||||
++citr)
|
||||
@@ -289,11 +293,104 @@ void Viewer::frameEventTraversal()
|
||||
if (gw)
|
||||
{
|
||||
gw->checkEvents();
|
||||
gw->getEventQueue()->takeEvents(events);
|
||||
|
||||
osgGA::EventQueue::Events gw_events;
|
||||
gw->getEventQueue()->takeEvents(gw_events);
|
||||
|
||||
for(osgGA::EventQueue::Events::iterator itr = gw_events.begin();
|
||||
itr != gw_events.end();
|
||||
++itr)
|
||||
{
|
||||
osgGA::GUIEventAdapter* event = itr->get();
|
||||
|
||||
bool pointerEvent = false;
|
||||
|
||||
float x = event->getX();
|
||||
float y = event->getY();
|
||||
|
||||
bool invert_y = event->getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS;
|
||||
if (invert_y) y = gw->getTraits()->height - y;
|
||||
|
||||
switch(event->getEventType())
|
||||
{
|
||||
case(osgGA::GUIEventAdapter::PUSH):
|
||||
case(osgGA::GUIEventAdapter::RELEASE):
|
||||
case(osgGA::GUIEventAdapter::DRAG):
|
||||
case(osgGA::GUIEventAdapter::MOVE):
|
||||
{
|
||||
pointerEvent = true;
|
||||
|
||||
if (event->getEventType()!=osgGA::GUIEventAdapter::DRAG || !getCameraWithFocus())
|
||||
{
|
||||
osg::GraphicsContext::Cameras& cameras = gw->getCameras();
|
||||
for(osg::GraphicsContext::Cameras::iterator citr = cameras.begin();
|
||||
citr != cameras.end();
|
||||
++citr)
|
||||
{
|
||||
osg::Camera* camera = *citr;
|
||||
osg::Viewport* viewport = camera ? camera->getViewport() : 0;
|
||||
if (viewport &&
|
||||
x >= viewport->x() && y >= viewport->y() &&
|
||||
x <= (viewport->x()+viewport->width()) && y <= (viewport->y()+viewport->height()) )
|
||||
{
|
||||
setCameraWithFocus(camera);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (pointerEvent)
|
||||
{
|
||||
if (getCameraWithFocus())
|
||||
{
|
||||
osg::Viewport* viewport = getCameraWithFocus()->getViewport();
|
||||
osg::Matrix localCameraVPW = getCameraWithFocus()->getViewMatrix() * getCameraWithFocus()->getProjectionMatrix();
|
||||
if (viewport) localCameraVPW *= viewport->computeWindowMatrix();
|
||||
|
||||
osg::Matrix matrix( osg::Matrix::inverse(localCameraVPW) * masterCameraVPW );
|
||||
|
||||
osg::Vec3d new_coord = osg::Vec3d(x,y,0.0) * matrix;
|
||||
|
||||
x = new_coord.x();
|
||||
y = new_coord.y();
|
||||
|
||||
event->setInputRange(eventState->getXmin(), eventState->getYmin(), eventState->getXmax(), eventState->getYmax());
|
||||
event->setX(x);
|
||||
event->setY(y);
|
||||
event->setMouseYOrientation(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS);
|
||||
|
||||
}
|
||||
// pass along the new pointer events details to the eventState of the viewer
|
||||
eventState->setX(x);
|
||||
eventState->setY(y);
|
||||
eventState->setButtonMask(event->getButtonMask());
|
||||
eventState->setMouseYOrientation(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
event->setInputRange(eventState->getXmin(), eventState->getYmin(), eventState->getXmax(), eventState->getYmax());
|
||||
event->setX(eventState->getX());
|
||||
event->setY(eventState->getY());
|
||||
event->setButtonMask(eventState->getButtonMask());
|
||||
event->setMouseYOrientation(eventState->getMouseYOrientation());
|
||||
}
|
||||
//osg::notify(osg::NOTICE)<<" mouse x = "<<event->getX()<<" y="<<event->getY()<<std::endl;
|
||||
// osg::notify(osg::NOTICE)<<" mouse Xmin = "<<event->getXmin()<<" Ymin="<<event->getYmin()<<" xMax="<<event->getXmax()<<" Ymax="<<event->getYmax()<<std::endl;
|
||||
}
|
||||
|
||||
events.insert(events.end(), gw_events.begin(), gw_events.end());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
osgGA::GUIEventAdapter* eventState = getEventQueue()->getCurrentEventState();
|
||||
#if 0
|
||||
// pointer coordinate transform
|
||||
for(osgGA::EventQueue::Events::iterator itr = events.begin();
|
||||
itr != events.end();
|
||||
++itr)
|
||||
@@ -321,12 +418,13 @@ void Viewer::frameEventTraversal()
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
#endif
|
||||
|
||||
// osg::notify(osg::NOTICE)<<"mouseEventState Xmin = "<<eventState->getXmin()<<" Ymin="<<eventState->getYmin()<<" xMax="<<eventState->getXmax()<<" Ymax="<<eventState->getYmax()<<std::endl;
|
||||
|
||||
|
||||
_eventQueue->frame( _scene->getFrameStamp()->getReferenceTime() );
|
||||
|
||||
_eventQueue->takeEvents(events);
|
||||
|
||||
|
||||
@@ -360,6 +458,9 @@ void Viewer::frameEventTraversal()
|
||||
case(osgGA::GUIEventAdapter::KEYUP):
|
||||
osg::notify(osg::NOTICE)<<" KEYUP '"<<(char)event->getKey()<<"'"<<std::endl;
|
||||
break;
|
||||
case(osgGA::GUIEventAdapter::RESIZE):
|
||||
osg::notify(osg::NOTICE)<<" RESIZE "<<std::endl;
|
||||
break;
|
||||
case(osgGA::GUIEventAdapter::FRAME):
|
||||
// osg::notify(osg::NOTICE)<<" FRAME "<<std::endl;
|
||||
break;
|
||||
@@ -379,7 +480,7 @@ void Viewer::frameEventTraversal()
|
||||
switch(event->getEventType())
|
||||
{
|
||||
case(osgGA::GUIEventAdapter::KEYUP):
|
||||
if (event->getKey()=='q') _done = true;
|
||||
if (event->getKey()==osgGA::GUIEventAdapter::KEY_Escape) _done = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -388,8 +489,6 @@ void Viewer::frameEventTraversal()
|
||||
|
||||
if (_done) return;
|
||||
|
||||
ActionAdapter aa;
|
||||
|
||||
for(osgGA::EventQueue::Events::iterator itr = events.begin();
|
||||
itr != events.end();
|
||||
++itr)
|
||||
@@ -400,16 +499,17 @@ void Viewer::frameEventTraversal()
|
||||
|
||||
if (_cameraManipulator.valid())
|
||||
{
|
||||
_cameraManipulator->handle( *event, aa);
|
||||
_cameraManipulator->handle( *event, *this);
|
||||
}
|
||||
|
||||
for(EventHandlers::iterator hitr = _eventHandlers.begin();
|
||||
hitr != _eventHandlers.end() && !handled;
|
||||
++hitr)
|
||||
{
|
||||
handled = (*hitr)->handle( *event, aa, 0, 0);
|
||||
handled = (*hitr)->handle( *event, *this, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Viewer::frameUpdateTraversal()
|
||||
|
||||
Reference in New Issue
Block a user