diff --git a/examples/osgcameragroup/osgcameragroup.cpp b/examples/osgcameragroup/osgcameragroup.cpp index fc752ffb6..334efed9c 100644 --- a/examples/osgcameragroup/osgcameragroup.cpp +++ b/examples/osgcameragroup/osgcameragroup.cpp @@ -83,7 +83,7 @@ int main( int argc, char **argv ) // set the keyboard mouse callback to catch the events from the windows. bool done = false; - osgProducer::KeyboardMouseCallback kbmcb(done); + osgProducer::KeyboardMouseCallback kbmcb(kbm,done); kbmcb.setStartTick(start_tick); // register the callback with the keyboard mouse manger. diff --git a/include/osgGA/GUIActionAdapter b/include/osgGA/GUIActionAdapter index dc83ef0fa..15242e845 100644 --- a/include/osgGA/GUIActionAdapter +++ b/include/osgGA/GUIActionAdapter @@ -75,7 +75,7 @@ public: to initialise the mouse pointer when mouse position relative to a controls neutral mouse position is required, i.e when mimicking a aircrafts joystick. */ - virtual void requestWarpPointer(int x,int y) = 0; + virtual void requestWarpPointer(float x,float y) = 0; }; diff --git a/include/osgGA/GUIEventAdapter b/include/osgGA/GUIEventAdapter index 041aec412..7bb6a3b4f 100644 --- a/include/osgGA/GUIEventAdapter +++ b/include/osgGA/GUIEventAdapter @@ -230,24 +230,24 @@ public: /** button pressed/released, return -1 if inappropriate for this event.*/ virtual int getButton() const = 0; - /** window minimum x. */ - virtual int getXmin() const = 0; + /** manimum x mouse position. */ + virtual float getXmin() const = 0; - /** window maximum x. */ - virtual int getXmax() const = 0; + /** maximum x mouse position. */ + virtual float getXmax() const = 0; - /** window minimum y. */ - virtual int getYmin() const = 0; + /** minimum y mouse position. */ + virtual float getYmin() const = 0; - /** window maximum y. */ - virtual int getYmax() const = 0; + /** maximum y mouse position. */ + virtual float getYmax() const = 0; /** current mouse x position.*/ - virtual int getX() const = 0; + virtual float getX() const = 0; /** current mouse y position.*/ - virtual int getY() const = 0; - + virtual float getY() const = 0; + /** current mouse button state */ virtual unsigned int getButtonMask() const = 0; @@ -256,6 +256,18 @@ public: /** time in seconds of event. */ virtual double time() const = 0; + + /** return the getX() value normalised to the range of -1 to 1. + * -1 would be the left hand side of the window. + * 0.0 would be the middle of the window. + * +1 would be the right hand side of the window.*/ + inline float getXnormalized() const { return 2.0f*(getX()-getXmin())/(getXmax()-getXmin())-1.0f; } + + /** return the getY() value normalised to the range of -1 to 1. + * -1 would be the bottom of the window. + * 0.0 would be the middle of the window. + * +1 would be the top of the window.*/ + inline float getYnormalized() const { return 2.0f*(getY()-getYmin())/(getYmax()-getYmin())-1.0f; } protected: diff --git a/include/osgProducer/ActionAdapter b/include/osgProducer/ActionAdapter index 71d37dd85..64e3ad8dd 100644 --- a/include/osgProducer/ActionAdapter +++ b/include/osgProducer/ActionAdapter @@ -26,7 +26,7 @@ class ActionAdapter : public osgGA::GUIActionAdapter void requestContinuousUpdate(bool) {} - void requestWarpPointer(int,int) {} + void requestWarpPointer(float ,float ) {} }; diff --git a/include/osgProducer/EventAdapter b/include/osgProducer/EventAdapter index c37cdbc10..cb2c3d5c5 100644 --- a/include/osgProducer/EventAdapter +++ b/include/osgProducer/EventAdapter @@ -40,22 +40,22 @@ class OSGPRODUCER_EXPORT EventAdapter : public osgGA::GUIEventAdapter virtual int getButton() const { return _button; } /** window minimum x. */ - virtual int getXmin() const { return _Xmin; } + virtual float getXmin() const { return _Xmin; } /** window maximum x. */ - virtual int getXmax() const { return _Xmax; } + virtual float getXmax() const { return _Xmax; } /** window minimum y. */ - virtual int getYmin() const { return _Ymin; } + virtual float getYmin() const { return _Ymin; } /** window maximum y. */ - virtual int getYmax() const { return _Ymax; } + virtual float getYmax() const { return _Ymax; } /** current mouse x position.*/ - virtual int getX() const { return _mx; } + virtual float getX() const { return _mx; } /** current mouse y position.*/ - virtual int getY() const { return _my; } + virtual float getY() const { return _my; } /** current mouse button state */ virtual unsigned int getButtonMask() const { return _buttonMask; } @@ -66,14 +66,14 @@ class OSGPRODUCER_EXPORT EventAdapter : public osgGA::GUIEventAdapter virtual unsigned int getModKeyMask() const { return _modKeyMask; } /** static method for setting window dimensions.*/ - static void setWindowSize(int Xmin, int Ymin, int Xmax, int Ymax); + static void setWindowSize(float Xmin, float Ymin, float Xmax, float Ymax); /** static method for setting button state.*/ static void setButtonMask(unsigned int buttonMask); - /** method for adapting resize events. */ - void adaptResize(double t, int Xmin, int Ymin, int Xmax, int Ymax); + /** method for adapting resize events. */ + void adaptResize(double t, float Xmin, float Ymin, float Xmax, float Ymax); /** method for adapting mouse motion events whilst mouse buttons are pressed.*/ void adaptMouseMotion(double t, float x, float y); @@ -99,10 +99,10 @@ class OSGPRODUCER_EXPORT EventAdapter : public osgGA::GUIEventAdapter EventType _eventType; int _key; int _button; - int _Xmin,_Xmax; - int _Ymin,_Ymax; - int _mx; - int _my; + float _Xmin,_Xmax; + float _Ymin,_Ymax; + float _mx; + float _my; unsigned int _buttonMask; unsigned int _modKeyMask; double _time; @@ -119,21 +119,14 @@ class OSGPRODUCER_EXPORT EventAdapter : public osgGA::GUIEventAdapter static int _s_button; // used to store window min and max values. - static int _s_Xmin; - static int _s_Xmax; - static int _s_Ymin; - static int _s_Ymax; - static int _s_mx; - static int _s_my; + static float _s_Xmin; + static float _s_Xmax; + static float _s_Ymin; + static float _s_Ymax; + static float _s_mx; + static float _s_my; static int _s_modKeyMask; - typedef std::map KeySymbolMap; - static KeySymbolMap s_keySymbolMap; - static bool s_keySymbolMapInitialized; - - bool initKeySymbolMap(); - int adaptKeySymbol(Producer::KeySymbol key); - }; } diff --git a/include/osgProducer/KeyboardMouseCallback b/include/osgProducer/KeyboardMouseCallback index 03f8a5465..3a2fb3eef 100644 --- a/include/osgProducer/KeyboardMouseCallback +++ b/include/osgProducer/KeyboardMouseCallback @@ -30,8 +30,9 @@ namespace osgProducer { class OSGPRODUCER_EXPORT KeyboardMouseCallback : public Producer::KeyboardMouseCallback { public: - KeyboardMouseCallback(bool &done, bool escapeKeySetsDone=true) : + KeyboardMouseCallback(Producer::KeyboardMouse* keyboardMouse, bool &done, bool escapeKeySetsDone=true) : Producer::KeyboardMouseCallback(), + _keyboardMouse(keyboardMouse), _mx(0.0f),_my(0.0f),_mbutton(0), _done(done), _escapeKeySetsDone(escapeKeySetsDone) @@ -72,8 +73,14 @@ class OSGPRODUCER_EXPORT KeyboardMouseCallback : public Producer::KeyboardMouseC double getTime() { return _timer.delta_s(_startTick,_timer.tick()); } + Producer::KeyboardMouse* getKeyboardMouse() { return _keyboardMouse; } + const Producer::KeyboardMouse* getKeyboardMouse() const { return _keyboardMouse; } + protected: + EventAdapter* createEventAdapter(); + + Producer::KeyboardMouse* _keyboardMouse; float _mx, _my; unsigned int _mbutton; bool &_done; diff --git a/include/osgProducer/Viewer b/include/osgProducer/Viewer index f1ea3b65c..a015abd04 100644 --- a/include/osgProducer/Viewer +++ b/include/osgProducer/Viewer @@ -80,7 +80,7 @@ class OSGPRODUCER_EXPORT Viewer : public OsgCameraGroup, public osgGA::GUIAction virtual void requestRedraw() {} virtual void requestContinuousUpdate(bool) {} - virtual void requestWarpPointer(int x,int y); + virtual void requestWarpPointer(float x,float y); typedef std::list< osg::ref_ptr > EventHandlerList; EventHandlerList& getEventHandlerList() { return _eventHandlerList; } diff --git a/src/osgGA/DriveManipulator.cpp b/src/osgGA/DriveManipulator.cpp index 1d6d801bd..1a4277a5f 100644 --- a/src/osgGA/DriveManipulator.cpp +++ b/src/osgGA/DriveManipulator.cpp @@ -157,7 +157,7 @@ void DriveManipulator::home(const GUIEventAdapter& ea,GUIActionAdapter& us) us.requestRedraw(); - us.requestWarpPointer((ea.getXmin()+ea.getXmax())/2,(ea.getYmin()+ea.getYmax())/2); + us.requestWarpPointer((ea.getXmin()+ea.getXmax())/2.0f,(ea.getYmin()+ea.getYmax())/2.0f); flushMouseEventStack(); @@ -258,7 +258,7 @@ void DriveManipulator::init(const GUIEventAdapter& ea,GUIActionAdapter& us) if (ea.getEventType()!=GUIEventAdapter::RESIZE) { - us.requestWarpPointer((ea.getXmin()+ea.getXmax())/2,(ea.getYmin()+ea.getYmax())/2); + us.requestWarpPointer((ea.getXmin()+ea.getXmax())/2.0f,(ea.getYmin()+ea.getYmax())/2.0f); } computeLocalDataFromCamera(); @@ -455,9 +455,8 @@ bool DriveManipulator::calcMovement() { case(USE_MOUSE_Y_FOR_SPEED): { - float my = (_ga_t0->getYmin()+_ga_t0->getYmax())/2.0f; - float dy = _ga_t0->getY()-my; - _velocity = -_modelScale*0.0002f*dy; + float dy = _ga_t0->getYnormalized(); + _velocity = -_modelScale*0.2f*dy; break; } case(USE_MOUSE_BUTTONS_FOR_SPEED): @@ -494,11 +493,9 @@ bool DriveManipulator::calcMovement() osg::Vec3 lv = osg::Vec3(0.0f,0.0f,-1.0f) * rotation_matrix; // rotate the camera. - float mx = (_ga_t0->getXmin()+_ga_t0->getXmax())/2.0f; + float dx = _ga_t0->getXnormalized(); - float dx = _ga_t0->getX()-mx; - - float yaw = -inDegrees(dx*0.1f*dt); + float yaw = -inDegrees(dx*50.0f*dt); osg::Quat yaw_rotation; yaw_rotation.makeRotate(yaw,up); diff --git a/src/osgGA/FlightManipulator.cpp b/src/osgGA/FlightManipulator.cpp index 74c22d97d..cdb1b682b 100644 --- a/src/osgGA/FlightManipulator.cpp +++ b/src/osgGA/FlightManipulator.cpp @@ -58,7 +58,7 @@ void FlightManipulator::home(const GUIEventAdapter& ea,GUIActionAdapter& us) us.requestRedraw(); - us.requestWarpPointer((ea.getXmin()+ea.getXmax())/2,(ea.getYmin()+ea.getYmax())/2); + us.requestWarpPointer((ea.getXmin()+ea.getXmax())/2.0f,(ea.getYmin()+ea.getYmax())/2.0f); computeLocalDataFromCamera(); @@ -79,7 +79,7 @@ void FlightManipulator::init(const GUIEventAdapter& ea,GUIActionAdapter& us) if (ea.getEventType()!=GUIEventAdapter::RESIZE) { - us.requestWarpPointer((ea.getXmin()+ea.getXmax())/2,(ea.getYmin()+ea.getYmax())/2); + us.requestWarpPointer((ea.getXmin()+ea.getXmax())/2.0f,(ea.getYmin()+ea.getYmax())/2.0f); } computeLocalDataFromCamera(); @@ -269,11 +269,8 @@ bool FlightManipulator::calcMovement() } - float mx = (_ga_t0->getXmin()+_ga_t0->getXmax())/2.0f; - float my = (_ga_t0->getYmin()+_ga_t0->getYmax())/2.0f; - - float dx = _ga_t0->getX()-mx; - float dy = _ga_t0->getY()-my; + float dx = _ga_t0->getXnormalized(); + float dy = _ga_t0->getYnormalized(); osg::Matrix rotation_matrix; rotation_matrix.makeRotate(_rotation); @@ -284,8 +281,8 @@ bool FlightManipulator::calcMovement() osg::Vec3 sv = lv^up; sv.normalize(); - float pitch = inDegrees(dy*0.15f*dt); - float roll = inDegrees(dx*0.1f*dt); + float pitch = inDegrees(dy*75.0f*dt); + float roll = inDegrees(dx*50.0f*dt); osg::Quat delta_rotate; diff --git a/src/osgGA/TrackballManipulator.cpp b/src/osgGA/TrackballManipulator.cpp index b498f99b3..0639c1bd8 100644 --- a/src/osgGA/TrackballManipulator.cpp +++ b/src/osgGA/TrackballManipulator.cpp @@ -187,10 +187,10 @@ bool TrackballManipulator::isMouseMoving() { if (_ga_t0.get()==NULL || _ga_t1.get()==NULL) return false; - static const float velocity = 100.0f; + static const float velocity = 0.1f; - float dx = _ga_t0->getX()-_ga_t1->getX(); - float dy = _ga_t0->getY()-_ga_t1->getY(); + float dx = _ga_t0->getXnormalized()-_ga_t1->getXnormalized(); + float dy = _ga_t0->getYnormalized()-_ga_t1->getYnormalized(); float len = sqrtf(dx*dx+dy*dy); float dt = _ga_t0->time()-_ga_t1->time(); @@ -253,8 +253,8 @@ bool TrackballManipulator::calcMovement() // return if less then two events have been added. if (_ga_t0.get()==NULL || _ga_t1.get()==NULL) return false; - float dx = _ga_t0->getX()-_ga_t1->getX(); - float dy = _ga_t0->getY()-_ga_t1->getY(); + float dx = _ga_t0->getXnormalized()-_ga_t1->getXnormalized(); + float dy = _ga_t0->getYnormalized()-_ga_t1->getYnormalized(); // return if there is no movement. @@ -306,7 +306,7 @@ bool TrackballManipulator::calcMovement() // pan model. - float scale = 0.0015f*focalLength; + float scale = 0.5f*focalLength; osg::Vec3 uv = _camera->getUpVector(); osg::Vec3 sv = _camera->getSideVector(); @@ -325,7 +325,7 @@ bool TrackballManipulator::calcMovement() // zoom model. float fd = focalLength; - float scale = 1.0f-dy*0.001f; + float scale = 1.0f-dy; if (fd*scale>_modelScale*_minimumZoomScale) { @@ -339,7 +339,7 @@ bool TrackballManipulator::calcMovement() // notify(DEBUG_INFO) << "Pushing forward"<getLookVector()*(dy*scale); _center += dv; diff --git a/src/osgProducer/EventAdapter.cpp b/src/osgProducer/EventAdapter.cpp index 4d8214e8e..c425b3545 100644 --- a/src/osgProducer/EventAdapter.cpp +++ b/src/osgProducer/EventAdapter.cpp @@ -7,15 +7,12 @@ unsigned int EventAdapter::_s_accumulatedButtonMask = 0; int EventAdapter::_s_button = 0; int EventAdapter::_s_modKeyMask = 0; -int EventAdapter::_s_Xmin = 0; -int EventAdapter::_s_Xmax = 1280; -int EventAdapter::_s_Ymin = 0; -int EventAdapter::_s_Ymax = 1024; -int EventAdapter::_s_mx = 0; -int EventAdapter::_s_my = 0; - -EventAdapter::KeySymbolMap EventAdapter::s_keySymbolMap; -bool EventAdapter::s_keySymbolMapInitialized = false; +float EventAdapter::_s_Xmin = 0; +float EventAdapter::_s_Xmax = 1280; +float EventAdapter::_s_Ymin = 0; +float EventAdapter::_s_Ymax = 1024; +float EventAdapter::_s_mx = 0; +float EventAdapter::_s_my = 0; static float s_xOffset=1.0f; static float s_xScale=0.5f; @@ -53,7 +50,7 @@ void EventAdapter::copyStaticVariables() } -void EventAdapter::setWindowSize(int Xmin, int Ymin, int Xmax, int Ymax) +void EventAdapter::setWindowSize(float Xmin, float Ymin, float Xmax, float Ymax) { _s_Xmin = Xmin; _s_Xmax = Xmax; @@ -68,7 +65,7 @@ void EventAdapter::setButtonMask(unsigned int buttonMask) } -void EventAdapter::adaptResize(double time, int Xmin, int Ymin, int Xmax, int Ymax) +void EventAdapter::adaptResize(double time, float Xmin, float Ymin, float Xmax, float Ymax) { setWindowSize(Xmin,Ymin,Xmax,Ymax); _eventType = RESIZE; @@ -102,8 +99,8 @@ void EventAdapter::adaptButtonPress(double time,float x, float y, unsigned int b break; } - _s_mx = (int)((x+s_xOffset)*s_xScale*(float)(_s_Xmax-_s_Xmin))+_s_Xmin; - _s_my = (int)((y+s_yOffset)*s_yScale*(float)(_s_Ymin-_s_Ymax))+_s_Ymax; + _s_mx = (float)((x+s_xOffset)*s_xScale*(float)(_s_Xmax-_s_Xmin))+_s_Xmin; + _s_my = (float)((y+s_yOffset)*s_yScale*(float)(_s_Ymin-_s_Ymax))+_s_Ymax; copyStaticVariables(); } @@ -134,8 +131,8 @@ void EventAdapter::adaptButtonRelease(double time,float x, float y, unsigned int break; } - _s_mx = (int)((x+s_xOffset)*s_xScale*(float)(_s_Xmax-_s_Xmin))+_s_Xmin; - _s_my = (int)((y+s_yOffset)*s_yScale*(float)(_s_Ymin-_s_Ymax))+_s_Ymax; + _s_mx = (float)((x+s_xOffset)*s_xScale*(float)(_s_Xmax-_s_Xmin))+_s_Xmin; + _s_my = (float)((y+s_yOffset)*s_yScale*(float)(_s_Ymin-_s_Ymax))+_s_Ymax; copyStaticVariables(); } @@ -149,8 +146,8 @@ void EventAdapter::adaptMouseMotion(double time, float x, float y) MOVE; _time = time; - _s_mx = (int)((x+s_xOffset)*s_xScale*(float)(_s_Xmax-_s_Xmin))+_s_Xmin; - _s_my = (int)((y+s_yOffset)*s_yScale*(float)(_s_Ymin-_s_Ymax))+_s_Ymax; + _s_mx = (float)((x+s_xOffset)*s_xScale*(float)(_s_Xmax-_s_Xmin))+_s_Xmin; + _s_my = (float)((y+s_yOffset)*s_yScale*(float)(_s_Ymin-_s_Ymax))+_s_Ymax; copyStaticVariables(); } @@ -161,7 +158,7 @@ void EventAdapter::adaptKeyPress( double time, Producer::KeySymbol key) { _eventType = KEYDOWN; _time = time; - _key = adaptKeySymbol(key); + _key = key; copyStaticVariables(); } @@ -171,7 +168,7 @@ void EventAdapter::adaptKeyRelease( double time, Producer::KeySymbol key) // we won't handle this correctly right now.. GUIEventAdapter isn't up to it _eventType = KEYUP; _time = time; - _key = adaptKeySymbol(key); + _key = key; copyStaticVariables(); } @@ -186,142 +183,3 @@ void EventAdapter::adaptFrame(double time) copyStaticVariables(); } - -bool EventAdapter::initKeySymbolMap() -{ -#ifdef WIN32 - - - #if 0 - - /* - // not mapped yet as I can't see an - // obvious mapping to X11/osgGA::GUIEventAdapter::KeySymbol. - s_keySymbolMap[VK_CAPITAL] = ; - s_keySymbolMap[VK_CONVERT] = ; - s_keySymbolMap[VK_NONCONVERT] = ; - s_keySymbolMap[VK_ACCEPT] = ; - s_keySymbolMap[VK_SNAPSHOT] = ; - - s_keySymbolMap[VK_LWIN] = ; - s_keySymbolMap[VK_RWIN] = ; - s_keySymbolMap[VK_APPS] = ; - - s_keySymbolMap[VK_ATTN] = ; - s_keySymbolMap[VK_CRSEL] = ; - s_keySymbolMap[VK_EXSEL] = ; - s_keySymbolMap[VK_EREOF] = ; - s_keySymbolMap[VK_PLAY] = ; - s_keySymbolMap[VK_ZOOM] = ; - s_keySymbolMap[VK_NONAME] = ; - s_keySymbolMap[VK_PA1] = ; - */ - - // mapped to osgGA::GUIEventAdapter::KeySymbol - s_keySymbolMap[VK_CANCEL] = KEY_Cancel; - - s_keySymbolMap[VK_BACK] = KEY_BackSpace; - s_keySymbolMap[VK_TAB] = KEY_Tab; - - s_keySymbolMap[VK_CLEAR] = KEY_Clear; - s_keySymbolMap[VK_RETURN] = KEY_Return; - - s_keySymbolMap[VK_SHIFT] = KEY_Shift_Lock; - s_keySymbolMap[VK_CONTROL] = KEY_Control_L; - s_keySymbolMap[VK_MENU] = KEY_Menu; - s_keySymbolMap[VK_PAUSE ] = KEY_Pause; - - s_keySymbolMap[VK_ESCAPE] = KEY_Escape; - - s_keySymbolMap[VK_MODECHANGE] = KEY_Mode_switch; - - s_keySymbolMap[VK_SPACE] = KEY_Space; - s_keySymbolMap[VK_PRIOR] = KEY_Prior; - s_keySymbolMap[VK_NEXT] = KEY_Next; - s_keySymbolMap[VK_END] = KEY_End; - s_keySymbolMap[VK_HOME] = KEY_Home; - s_keySymbolMap[VK_LEFT] = KEY_Left; - s_keySymbolMap[VK_UP] = KEY_Up; - s_keySymbolMap[VK_RIGHT] = KEY_Right; - s_keySymbolMap[VK_DOWN] = KEY_Down; - s_keySymbolMap[VK_SELECT] = KEY_Select; - s_keySymbolMap[VK_PRINT] = KEY_Print; - s_keySymbolMap[VK_EXECUTE] = KEY_Execute; - s_keySymbolMap[VK_INSERT] = KEY_Insert; - s_keySymbolMap[VK_DELETE] = KEY_Delete; - s_keySymbolMap[VK_HELP] = KEY_Help; - - s_keySymbolMap[VK_NUMPAD0] = KEY_KP_0; - s_keySymbolMap[VK_NUMPAD1] = KEY_KP_1; - s_keySymbolMap[VK_NUMPAD2] = KEY_KP_2; - s_keySymbolMap[VK_NUMPAD3] = KEY_KP_3; - s_keySymbolMap[VK_NUMPAD4] = KEY_KP_4; - s_keySymbolMap[VK_NUMPAD5] = KEY_KP_5; - s_keySymbolMap[VK_NUMPAD6] = KEY_KP_6; - s_keySymbolMap[VK_NUMPAD7] = KEY_KP_7; - s_keySymbolMap[VK_NUMPAD8] = KEY_KP_8; - s_keySymbolMap[VK_NUMPAD9] = KEY_KP_9; - s_keySymbolMap[VK_MULTIPLY] = KEY_KP_Multiply; - s_keySymbolMap[VK_ADD] = KEY_KP_Add; - s_keySymbolMap[VK_SEPARATOR] = KEY_KP_Separator; - s_keySymbolMap[VK_SUBTRACT] = KEY_KP_Subtract; - s_keySymbolMap[VK_DECIMAL] = KEY_KP_Decimal; - s_keySymbolMap[VK_DIVIDE] = KEY_KP_Divide; - s_keySymbolMap[VK_F1] = KEY_F1; - s_keySymbolMap[VK_F2] = KEY_F2; - s_keySymbolMap[VK_F3] = KEY_F3; - s_keySymbolMap[VK_F4] = KEY_F4; - s_keySymbolMap[VK_F5] = KEY_F5; - s_keySymbolMap[VK_F6] = KEY_F6; - s_keySymbolMap[VK_F7] = KEY_F7; - s_keySymbolMap[VK_F8] = KEY_F8; - s_keySymbolMap[VK_F9] = KEY_F9; - s_keySymbolMap[VK_F10] = KEY_F10; - s_keySymbolMap[VK_F11] = KEY_F11; - s_keySymbolMap[VK_F12] = KEY_F12; - s_keySymbolMap[VK_F13] = KEY_F13; - s_keySymbolMap[VK_F14] = KEY_F14; - s_keySymbolMap[VK_F15] = KEY_F15; - s_keySymbolMap[VK_F16] = KEY_F16; - s_keySymbolMap[VK_F17] = KEY_F17; - s_keySymbolMap[VK_F18] = KEY_F18; - s_keySymbolMap[VK_F19] = KEY_F19; - s_keySymbolMap[VK_F20] = KEY_F20; - s_keySymbolMap[VK_F21] = KEY_F21; - s_keySymbolMap[VK_F22] = KEY_F22; - s_keySymbolMap[VK_F23] = KEY_F23; - s_keySymbolMap[VK_F24] = KEY_F24; - - s_keySymbolMap[VK_NUMLOCK] = KEY_Num_Lock; - s_keySymbolMap[VK_SCROLL] = KEY_Scroll_Lock; - - s_keySymbolMap[VK_LSHIFT] = KEY_Shift_L; - s_keySymbolMap[VK_RSHIFT] = KEY_Shift_R; - s_keySymbolMap[VK_LCONTROL] = KEY_Control_L; - s_keySymbolMap[VK_RCONTROL] = KEY_Control_R; - s_keySymbolMap[VK_LMENU] = KEY_Menu; - s_keySymbolMap[VK_RMENU] = KEY_Menu; - s_keySymbolMap[VK_OEM_CLEAR] = KEY_Clear; - #endif - - -#else - - // no mapping required for non windows (i.e. X11 based) - // since the osgGA::GUIEventAdapter::KeySybol values are - // take from X11/keysymdef.h - -#endif - - return true; -} - -int EventAdapter::adaptKeySymbol(Producer::KeySymbol key) -{ - if (!s_keySymbolMapInitialized) s_keySymbolMapInitialized = initKeySymbolMap(); - - KeySymbolMap::iterator itr = s_keySymbolMap.find(key); - if (itr!=s_keySymbolMap.end()) return itr->second; - else return key; -} - diff --git a/src/osgProducer/KeyboardMouseCallback.cpp b/src/osgProducer/KeyboardMouseCallback.cpp index 536b0aa0a..2ff1231b2 100644 --- a/src/osgProducer/KeyboardMouseCallback.cpp +++ b/src/osgProducer/KeyboardMouseCallback.cpp @@ -1,11 +1,7 @@ +#include #include -#ifdef WIN32 - #include -#else - #include -#endif - +#include using namespace osgProducer; @@ -15,8 +11,7 @@ void KeyboardMouseCallback::buttonPress( float mx, float my, unsigned int mbutto _my = my; _mbutton |= (1<<(mbutton-1)); - - osg::ref_ptr event = new EventAdapter; + osg::ref_ptr event = createEventAdapter(); event->adaptButtonPress(getTime(),mx,my,mbutton); _eventQueueMutex.lock(); @@ -30,8 +25,7 @@ void KeyboardMouseCallback::buttonRelease( float mx, float my, unsigned int mbut _my = my; _mbutton &= ~(1<<(mbutton-1)); - - osg::ref_ptr event = new EventAdapter; + osg::ref_ptr event = createEventAdapter(); event->adaptButtonRelease(getTime(),mx,my,mbutton); _eventQueueMutex.lock(); @@ -45,8 +39,7 @@ void KeyboardMouseCallback::doubleButtonPress( float mx, float my, unsigned int _my = my; _mbutton |= (1<<(mbutton-1)); - - osg::ref_ptr event = new EventAdapter; + osg::ref_ptr event = createEventAdapter(); event->adaptButtonPress(getTime(),mx,my,mbutton); _eventQueueMutex.lock(); @@ -57,16 +50,9 @@ void KeyboardMouseCallback::doubleButtonPress( float mx, float my, unsigned int void KeyboardMouseCallback::keyPress( Producer::KeyCharacter key ) { - - osg::ref_ptr event = new EventAdapter; + osg::ref_ptr event = createEventAdapter(); event->adaptKeyPress(getTime(),key); -// -// #ifdef WIN32 -// if (_escapeKeySetsDone && -// event->getKey()==VK_ESCAPE) _done = true; -// #endif - // check against adapted key symbol. if (_escapeKeySetsDone && event->getKey()==osgGA::GUIEventAdapter::KEY_Escape) _done = true; @@ -80,7 +66,7 @@ void KeyboardMouseCallback::keyPress( Producer::KeyCharacter key ) void KeyboardMouseCallback::keyRelease( Producer::KeyCharacter key ) { - osg::ref_ptr event = new EventAdapter; + osg::ref_ptr event = createEventAdapter(); event->adaptKeyRelease(getTime(),key); _eventQueueMutex.lock(); @@ -92,15 +78,9 @@ void KeyboardMouseCallback::specialKeyPress( Producer::KeyCharacter key ) { - osg::ref_ptr event = new EventAdapter; + osg::ref_ptr event = createEventAdapter(); event->adaptKeyPress(getTime(),key); - -// #ifdef WIN32 -// if (_escapeKeySetsDone && -// event->getKey()==VK_ESCAPE) _done = true; -// #endif - // check against adapted key symbol. if (_escapeKeySetsDone && event->getKey()==osgGA::GUIEventAdapter::KEY_Escape) _done = true; @@ -114,7 +94,7 @@ void KeyboardMouseCallback::specialKeyPress( Producer::KeyCharacter key ) void KeyboardMouseCallback::specialKeyRelease( Producer::KeyCharacter key ) { - osg::ref_ptr event = new EventAdapter; + osg::ref_ptr event = createEventAdapter(); event->adaptKeyRelease(getTime(),key); _eventQueueMutex.lock(); @@ -127,7 +107,7 @@ void KeyboardMouseCallback::mouseMotion( float mx, float my) _mx = mx; _my = my; - osg::ref_ptr event = new EventAdapter; + osg::ref_ptr event = createEventAdapter(); event->adaptMouseMotion(getTime(),mx,my); _eventQueueMutex.lock(); @@ -141,7 +121,7 @@ void KeyboardMouseCallback::passiveMouseMotion( float mx, float my) _mx = mx; _my = my; - osg::ref_ptr event = new EventAdapter; + osg::ref_ptr event = createEventAdapter(); event->adaptMouseMotion(getTime(),mx,my); _eventQueueMutex.lock(); @@ -158,3 +138,44 @@ void KeyboardMouseCallback::getEventQueue(EventQueue& queue) _eventQueueMutex.unlock(); } + +EventAdapter* KeyboardMouseCallback::createEventAdapter() +{ + EventAdapter* ea = new EventAdapter; + + Producer::InputArea* ia = _keyboardMouse->getInputArea(); + Producer::RenderSurface* rs = _keyboardMouse->getRenderSurface(); + if (ia) + { + float minX = FLT_MAX; + float minY = FLT_MAX; + float maxX = -FLT_MAX; + float maxY = -FLT_MAX; + int numInputRectangle = ia->getNumInputRectangle(); + for (int i=0;igetInputRectangle(i); + + minX = osg::minimum(minX,ir->left()); + minX = osg::minimum(minX,ir->left()+ir->width()); + + minY = osg::minimum(minY,ir->bottom()); + minY = osg::minimum(minY,ir->bottom()+ir->height()); + + maxX = osg::maximum(maxX,ir->left()); + maxX = osg::maximum(maxX,ir->left()+ir->width()); + + maxY = osg::maximum(maxY,ir->bottom()); + maxY = osg::maximum(maxY,ir->bottom()+ir->height()); + } + ea->setWindowSize(minX,minY,maxX,maxY); + } + else if (rs) + { + float xMin,yMin,xMax,yMax; + rs->getWindowRect(xMin,xMax,yMin,yMax); + ea->setWindowSize(xMin,yMin,xMax,yMax); + } + + return ea; +} diff --git a/src/osgProducer/Viewer.cpp b/src/osgProducer/Viewer.cpp index 453ca9dac..94f3d9d91 100644 --- a/src/osgProducer/Viewer.cpp +++ b/src/osgProducer/Viewer.cpp @@ -84,7 +84,7 @@ void Viewer::setUpViewer(unsigned int options) _start_tick = _timer.tick(); // set the keyboard mouse callback to catch the events from the windows. - _kbmcb = new osgProducer::KeyboardMouseCallback( _done, (options & ESCAPE_SETS_DONE)!=0 ); + _kbmcb = new osgProducer::KeyboardMouseCallback( kbm, _done, (options & ESCAPE_SETS_DONE)!=0 ); _kbmcb->setStartTick(_start_tick); // register the callback with the keyboard mouse manger. @@ -263,9 +263,15 @@ void Viewer::selectCameraManipulator(unsigned int no) if (_keyswitchManipulator.valid()) _keyswitchManipulator->selectCameraManipulator(no); } -void Viewer::requestWarpPointer(int x,int y) +void Viewer::requestWarpPointer(float x,float y) { + if (_kbmcb) + { + _kbmcb->getKeyboardMouse()->positionPointer(x,y); + return; + } + Producer::RenderSurface* rs = 0; // here we need to search for which render surface contains the pointer,