2012-03-06 13 views
4

OpenGLでマルチヘッドレンダリングが必要なアプリケーションを開発しています。今は複数の画面にレンダリングできますが、マウスカーソルの移動は1つの画面に制限されています。しかし、私はすべてのレンダリングされた画面上でマウスカーソルを使用できるようにしたいと思います。Ogre3D、Multiple Monitors、Mouse Cursor

誰もがこの同じ問題に遭遇しましたか?その場合、どのように解決しましたか?

答えて

6

私はこれのための解決策を見つけました。まず、私は私のOgre::RenderWindowウィンドウモードでのオブジェクトではなく、フルスクリーンモードをインスタンス化しなければならなかった - フルスクリーンモードがそうのように国境なしOgre::RenderWindowオブジェクトをインスタンス化することによって、十分に簡単エミュレートされました:

Ogre::NameValuePairList options; 
options["left"] = "0"; 
options["top"] = "0"; 
options["border"] = "none"; 
options["monitorIndex"] = "0"; 
m_pVisWindow[0] = mRoot->createRenderWindow("Window1", 1920, 1200, false, &options); 

options["monitorIndex"] = "1"; 
m_pVizWindow[1] = mRoot->createRenderWindow("Window2", 1920, 1200, false, &options); 

options["monitorIndex"] = "2"; 
m_pVizWindow[2] = mRoot->createRenderWindow("Window3", 1920, 1200, false, &options); 

options["monitorIndex"] = "3"; 
m_pVizWindow[3] = mRoot->createRenderWindow("Window4", 1920, 1200, false, &options); 

options["monitorIndex"] = "4"; 
m_pVizWindow[4] = mRoot->createRenderWindow("Window5", 1920, 1200, false, &options); 

options["monitorIndex"] = "5"; 
m_pVizWindow[5] = mRoot->createRenderWindow("Window6", 1920, 1200, false, &options); 

のコンストラクタでこの場合はExampleFrameListenerから継承していましたが、本来、既存のmInputManagerを破棄し、非排他的な入力としてOISを設定するためのパラメータを持つ新しいインスタンスをインスタンス化する必要がありました。が見つかりましたhere

mInputManager->destroyInputObject(mMouse); 
mInputManager->destroyInputObject(mKeyboard); 
mInputManager->destroyInputObject(mJoy); 
OIS::InputManager::destroyInputSystem(mInputManager); 

// override OIS construction to avoid grabbing mouse 
OIS::ParamList pl; 
size_t windowHnd = 0; 
std::ostringstream windowHndStr; 

window->getCustomAttribute("WINDOW", &windowHnd); 
windowHndStr << windowHnd; 
pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str())); 
#if defined OIS_WIN32_PLATFORM 
pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND"))); 
pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE"))); 
pl.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_FOREGROUND"))); 
pl.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_NONEXCLUSIVE"))); 
#elif defined OIS_LINUX_PLATFORM 
pl.insert(std::make_pair(std::string("x11_mouse_grab"), std::string("false"))); 
pl.insert(std::make_pair(std::string("x11_mouse_hide"), std::string("false"))); 
pl.insert(std::make_pair(std::string("x11_keyboard_grab"), std::string("false"))); 
pl.insert(std::make_pair(std::string("XAutoRepeatOn"), std::string("true"))); 
#endif 

mInputManager = OIS::InputManager::createInputSystem(pl); 

//Create all devices (We only catch joystick exceptions here, as, most people have Key/Mouse) 
mKeyboard = static_cast<OIS::Keyboard*>(mInputManager->createInputObject(OIS::OISKeyboard, false)); 
mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject(OIS::OISMouse, false)); 
try { 
    mJoy = static_cast<OIS::JoyStick*>(mInputManager->createInputObject(OIS::OISJoyStick, false)); 
} 
catch(...) { 
    mJoy = 0; 
} 

フォーカスを与えるために、特定のレンダリングウィンドウを物理的にクリックしなければならないので、mouseoverイベントのレンダリングウィンドウにフォーカスを与える方法があればいいと思いますが、これは合っています私の今のニーズ...