Ogre3D, несколько мониторов и курсор мыши - PullRequest
4 голосов
/ 06 марта 2012

Я занимаюсь разработкой приложения, которое требует многоголовочного рендеринга в OpenGL. Прямо сейчас я могу рендерить на несколько экранов, но перемещение моего курсора мыши ограничено одним экраном. Однако я хотел бы иметь возможность использовать курсор мыши на всех отображаемых экранах.

Кто-нибудь сталкивался с такой же проблемой, и если да, то как вы решили ее?

1 Ответ

6 голосов
/ 06 марта 2012

Я нашел рабочее решение для этого. Во-первых, мне пришлось создавать экземпляры моих 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);

В конструкторе Ogre::FrameListener, прикрепленном к каждому Ogre::RenderWindow (который в этом случае наследуется от ExampleFrameListener, мне по сути пришлось уничтожить существующий mInputManager и создать новый с параметрами для настройки OIS для неисключительного ввода. Более подробное описание того, как и зачем это делать, можно найти здесь .

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 - однако это сейчас соответствует моим потребностям ...

...