From 78cb15fdf80ec88b438adc07d17285adf0a5b174 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 9 Sep 2010 10:44:11 +0000 Subject: [PATCH] From Torben Dannhauer, "I extended the attached CMAKE module to search for the collada libraries of my VS2008 3rdParty package if no other library is found. No CMAKE should recognize all libraries of the VS2008 3rdParty Package." --- CMakeModules/FindCOLLADA.cmake | 46 +++++++--- .../osgViewer/api/Win32/GraphicsWindowWin32 | 6 +- src/osgViewer/GraphicsWindowWin32.cpp | 83 ++++++++++++++++--- 3 files changed, 111 insertions(+), 24 deletions(-) diff --git a/CMakeModules/FindCOLLADA.cmake b/CMakeModules/FindCOLLADA.cmake index f938ce0b6..01e7f3f99 100644 --- a/CMakeModules/FindCOLLADA.cmake +++ b/CMakeModules/FindCOLLADA.cmake @@ -13,7 +13,16 @@ # # Created by Robert Osfield. -SET(COLLADA_DOM_ROOT "$ENV{COLLADA_DIR}/dom" CACHE PATH "Location of Collada DOM directory") + +# Check if COLLADA_DIR is set, otherwise use ACTUAL_3DPARTY_DIR: +SET( COLLADA_ENV_VAR_AVAILABLE $ENV{COLLADA_DIR} ) +IF ( COLLADA_ENV_VAR_AVAILABLE ) + SET(COLLADA_DOM_ROOT "$ENV{COLLADA_DIR}/dom" CACHE PATH "Location of Collada DOM directory" FORCE) +ELSE ( COLLADA_ENV_VAR_AVAILABLE ) + SET(COLLADA_DOM_ROOT "${ACTUAL_3DPARTY_DIR}/include/1.4/dom" CACHE PATH "Location of Collada DOM directory" FORCE) +ENDIF( COLLADA_ENV_VAR_AVAILABLE ) + + IF(APPLE) SET(COLLADA_BUILDNAME "mac") @@ -41,6 +50,7 @@ FIND_PATH(COLLADA_INCLUDE_DIR dae.h /opt/csw/include # Blastwave /opt/include /usr/freeware/include + ${ACTUAL_3DPARTY_DIR}/include ) FIND_LIBRARY(COLLADA_DYNAMIC_LIBRARY @@ -62,6 +72,7 @@ FIND_LIBRARY(COLLADA_DYNAMIC_LIBRARY /opt/csw/lib /opt/lib /usr/freeware/lib64 + ${ACTUAL_3DPARTY_DIR}/lib ) FIND_LIBRARY(COLLADA_DYNAMIC_LIBRARY_DEBUG @@ -83,6 +94,7 @@ FIND_LIBRARY(COLLADA_DYNAMIC_LIBRARY_DEBUG /opt/csw/lib /opt/lib /usr/freeware/lib64 + ${ACTUAL_3DPARTY_DIR}/lib ) FIND_LIBRARY(COLLADA_STATIC_LIBRARY @@ -104,6 +116,7 @@ FIND_LIBRARY(COLLADA_STATIC_LIBRARY /opt/csw/lib /opt/lib /usr/freeware/lib64 + ${ACTUAL_3DPARTY_DIR}/lib ) FIND_LIBRARY(COLLADA_STATIC_LIBRARY_DEBUG @@ -125,13 +138,14 @@ FIND_LIBRARY(COLLADA_STATIC_LIBRARY_DEBUG /opt/csw/lib /opt/lib /usr/freeware/lib64 + ${ACTUAL_3DPARTY_DIR}/lib ) # find extra libraries that the static linking requires FIND_PACKAGE(LibXml2) IF (LIBXML2_FOUND) - SET(COLLADA_LIBXML_LIBRARY ${LIBXML2_LIBRARIES}) + SET(COLLADA_LIBXML_LIBRARY "${LIBXML2_LIBRARIES}" CACHE FILEPATH "" FORCE) ELSE(LIBXML2_FOUND) IF(WIN32) FIND_LIBRARY(COLLADA_LIBXML_LIBRARY @@ -139,13 +153,14 @@ FIND_LIBRARY(COLLADA_STATIC_LIBRARY_DEBUG PATHS ${COLLADA_DOM_ROOT}/external-libs/libxml2/win32/lib ${COLLADA_DOM_ROOT}/external-libs/libxml2/mingw/lib + ${ACTUAL_3DPARTY_DIR}/lib ) ENDIF(WIN32) ENDIF(LIBXML2_FOUND) FIND_PACKAGE(ZLIB) IF (ZLIB_FOUND) - SET(COLLADA_ZLIB_LIBRARY ${ZLIB_LIBRARY}) + SET(COLLADA_ZLIB_LIBRARY "${ZLIB_LIBRARY}" CACHE FILEPATH "" FORCE) ELSE(ZLIB_FOUND) IF(WIN32) FIND_LIBRARY(COLLADA_ZLIB_LIBRARY @@ -153,6 +168,7 @@ FIND_LIBRARY(COLLADA_STATIC_LIBRARY_DEBUG PATHS ${COLLADA_DOM_ROOT}/external-libs/libxml2/win32/lib ${COLLADA_DOM_ROOT}/external-libs/libxml2/mingw/lib + ${ACTUAL_3DPARTY_DIR}/lib ) ENDIF(WIN32) ENDIF(ZLIB_FOUND) @@ -163,14 +179,16 @@ FIND_LIBRARY(COLLADA_STATIC_LIBRARY_DEBUG ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/${COLLADA_BUILDNAME} ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mac ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mingw + ${ACTUAL_3DPARTY_DIR}/lib ) FIND_LIBRARY(COLLADA_PCRECPP_LIBRARY_DEBUG - NAMES pcrecpp-d + NAMES pcrecpp-d pcrecppd PATHS ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/${COLLADA_BUILDNAME} ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mac ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mingw + ${ACTUAL_3DPARTY_DIR}/lib ) FIND_LIBRARY(COLLADA_PCRE_LIBRARY @@ -179,14 +197,16 @@ FIND_LIBRARY(COLLADA_STATIC_LIBRARY_DEBUG ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/${COLLADA_BUILDNAME} ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mac ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mingw + ${ACTUAL_3DPARTY_DIR}/lib ) FIND_LIBRARY(COLLADA_PCRE_LIBRARY_DEBUG - NAMES pcre-d + NAMES pcre-d pcred PATHS ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/${COLLADA_BUILDNAME} ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mac ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mingw + ${ACTUAL_3DPARTY_DIR}/lib ) FIND_LIBRARY(COLLADA_MINIZIP_LIBRARY @@ -194,41 +214,47 @@ FIND_LIBRARY(COLLADA_STATIC_LIBRARY_DEBUG PATHS ${COLLADA_DOM_ROOT}/external-libs/minizip/win32/lib ${COLLADA_DOM_ROOT}/external-libs/minizip/mac + ${ACTUAL_3DPARTY_DIR}/lib ) FIND_LIBRARY(COLLADA_MINIZIP_LIBRARY_DEBUG - NAMES minizip-d + NAMES minizip-d minizipD PATHS ${COLLADA_DOM_ROOT}/external-libs/minizip/win32/lib ${COLLADA_DOM_ROOT}/external-libs/minizip/mac + ${ACTUAL_3DPARTY_DIR}/lib ) FIND_LIBRARY(COLLADA_BOOST_FILESYSTEM_LIBRARY - NAMES libboost_filesystem boost_filesystem + NAMES libboost_filesystem boost_filesystem libboost_filesystem-vc90-mt PATHS ${COLLADA_DOM_ROOT}/external-libs/boost/lib/${COLLADA_BUILDNAME} ${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw + ${ACTUAL_3DPARTY_DIR}/lib ) FIND_LIBRARY(COLLADA_BOOST_FILESYSTEM_LIBRARY_DEBUG - NAMES libboost_filesystem-d boost_filesystem-d + NAMES libboost_filesystem-d boost_filesystem-d libboost_filesystem-vc90-mt-gd PATHS ${COLLADA_DOM_ROOT}/external-libs/boost/lib/${COLLADA_BUILDNAME} ${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw + ${ACTUAL_3DPARTY_DIR}/lib ) FIND_LIBRARY(COLLADA_BOOST_SYSTEM_LIBRARY - NAMES libboost_system boost_system + NAMES libboost_system boost_system libboost_system-vc90-mt PATHS ${COLLADA_DOM_ROOT}/external-libs/boost/lib/${COLLADA_BUILDNAME} ${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw + ${ACTUAL_3DPARTY_DIR}/lib ) FIND_LIBRARY(COLLADA_BOOST_SYSTEM_LIBRARY_DEBUG - NAMES libboost_system-d boost_system-d + NAMES libboost_system-d boost_system-d libboost_system-vc90-mt-gd PATHS ${COLLADA_DOM_ROOT}/external-libs/boost/lib/${COLLADA_BUILDNAME} ${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw + ${ACTUAL_3DPARTY_DIR}/lib ) diff --git a/include/osgViewer/api/Win32/GraphicsWindowWin32 b/include/osgViewer/api/Win32/GraphicsWindowWin32 index e359bd940..a8d925c5e 100644 --- a/include/osgViewer/api/Win32/GraphicsWindowWin32 +++ b/include/osgViewer/api/Win32/GraphicsWindowWin32 @@ -135,7 +135,8 @@ class OSGVIEWER_EXPORT GraphicsWindowWin32 : public osgViewer::GraphicsWindow, p bool setPixelFormat(); - void adaptKey( WPARAM wParam, LPARAM lParam, int& keySymbol, unsigned int& modifierMask ); + // return true if it handled the key, otherwise return false so that we know it is WM_CHAR job to handle it + bool adaptKey( WPARAM wParam, LPARAM lParam, int& keySymbol, unsigned int& modifierMask ); void transformMouseXY(float& x, float& y); @@ -179,6 +180,9 @@ class OSGVIEWER_EXPORT GraphicsWindowWin32 : public osgViewer::GraphicsWindow, p std::map _mouseCursorMap; std::map _keyMap; + bool _keypresshandled; + int _lastkeysymbol; + std::map _scancode_unicode_Map; bool _applyWorkaroundForMultimonitorMultithreadNVidiaWin32Issues; }; diff --git a/src/osgViewer/GraphicsWindowWin32.cpp b/src/osgViewer/GraphicsWindowWin32.cpp index 160c9fc89..d25331732 100644 --- a/src/osgViewer/GraphicsWindowWin32.cpp +++ b/src/osgViewer/GraphicsWindowWin32.cpp @@ -2212,7 +2212,7 @@ void GraphicsWindowWin32::setSyncToVBlank( bool on ) #endif } -void GraphicsWindowWin32::adaptKey( WPARAM wParam, LPARAM lParam, int& keySymbol, unsigned int& modifierMask ) +bool GraphicsWindowWin32::adaptKey( WPARAM wParam, LPARAM lParam, int& keySymbol, unsigned int& modifierMask ) { modifierMask = 0; @@ -2224,7 +2224,7 @@ void GraphicsWindowWin32::adaptKey( WPARAM wParam, LPARAM lParam, int& keySymbol if (virtualKey==0 || !::GetKeyboardState(keyState)) { keySymbol = 0; - return; + return true; } switch (virtualKey) @@ -2280,10 +2280,15 @@ void GraphicsWindowWin32::adaptKey( WPARAM wParam, LPARAM lParam, int& keySymbol } else if ((keySymbol & 0xff00)==0) { - char asciiKey[2]; - int numChars = ::ToAscii(wParam, (lParam>>16)&0xff, keyState, reinterpret_cast(asciiKey), 0); - if (numChars>0) keySymbol = asciiKey[0]; + // store the raw key so to be used later in WM_CHAR event + keySymbol = ::MapVirtualKeyEx(HIWORD(lParam), 2, ::GetKeyboardLayout(0)); + + // might be an unicode key or dead key so need to be handled by WM_CHAR + return false; } + + // it was a special key so event is handled + return true; } void GraphicsWindowWin32::transformMouseXY( float& x, float& y ) @@ -2434,6 +2439,36 @@ LRESULT GraphicsWindowWin32::handleNativeWindowingEvent( HWND hwnd, UINT uMsg, W } } break; + ///////////////// + case WM_CHAR : + ///////////////// + { + // if event was not handled by WM_KEYDOWN then we take care of it here + // this method gives directly the utf16 char back so just need to add it as it is + if(!_keypresshandled) + { + // first check if key is already registered on the map + std::map::iterator it = _scancode_unicode_Map.find(_lastkeysymbol); + if(it != _scancode_unicode_Map.end()) + { + // map already exist -> key already pressed and not yet released + if((it->second != -1) && (it->second != wParam)) + { + // was a different char stored - probably a dead key combinaison + // -> we need to release it first + _keyMap[it->second] = false; + getEventQueue()->keyRelease(it->second, eventTime); + } + } + + // store the raw key in map so that we know what to release later in WM_KEYUP event + _scancode_unicode_Map[_lastkeysymbol] = wParam; + + _keyMap[wParam] = true; + getEventQueue()->keyPress(wParam, eventTime); + } + } + break; //////////////////// case WM_KEYDOWN : @@ -2443,10 +2478,19 @@ LRESULT GraphicsWindowWin32::handleNativeWindowingEvent( HWND hwnd, UINT uMsg, W { int keySymbol = 0; unsigned int modifierMask = 0; - adaptKey(wParam, lParam, keySymbol, modifierMask); - _keyMap[keySymbol] = true; - //getEventQueue()->getCurrentEventState()->setModKeyMask(modifierMask); - getEventQueue()->keyPress(keySymbol, eventTime); + if(adaptKey(wParam, lParam, keySymbol, modifierMask)) + { + // was a special key, we handled it + _keypresshandled = true; + _keyMap[keySymbol] = true; + getEventQueue()->keyPress(keySymbol, eventTime); + } + else + { + // was no special key, let WM_CHAR handle it + _keypresshandled = false; + _lastkeysymbol = keySymbol; + } } break; @@ -2458,10 +2502,23 @@ LRESULT GraphicsWindowWin32::handleNativeWindowingEvent( HWND hwnd, UINT uMsg, W { int keySymbol = 0; unsigned int modifierMask = 0; - adaptKey(wParam, lParam, keySymbol, modifierMask); - _keyMap[keySymbol] = false; - //getEventQueue()->getCurrentEventState()->setModKeyMask(modifierMask); - getEventQueue()->keyRelease(keySymbol, eventTime); + if(!adaptKey(wParam, lParam, keySymbol, modifierMask)) + { + // was not a special key - this mean we need to release the unicode key + // -> fetch it from the map + std::map::iterator it = _scancode_unicode_Map.find(keySymbol); + if(it != _scancode_unicode_Map.end()) + { + keySymbol = it->second; + it->second = -1; // clean the release key from the map + } + } + + if(keySymbol >= 0) + { + _keyMap[keySymbol] = false; + getEventQueue()->keyRelease(keySymbol, eventTime); + } } break;