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;