Может ли движок OGRE отображать в любом окне?

#windows #visual-c #com #ogre3d #ogre

#Windows #visual-c #com #ogre3d #ogre

Вопрос:

Я создаю небольшой интерфейс графического движка, который использует OGRE внутри. Идея заключается в том, что человек, создающий программу в Windows или Linux, сможет использовать мой плагин для выполнения любого рендеринга графики, который им нужен.

На самом деле уже есть приложение для Windows, использующее вызовы GDI и D3D для рисования, которое мне нужно изменить, чтобы оно могло использовать OGRE для рисования.

Что меня озадачивает, так это то, что приложение запрограммировано на VC и, следовательно, имеет меню в стиле Windows и клиентскую область для рисования. Но поскольку OGRE создает свое собственное окно для рендеринга, смогу ли я отправить дескриптор клиентской области окна приложения в OGRE и будет ли OGRE выполнять все отрисовки в клиентской области окна?

Я новичок в программировании Windows и немного ограничен во времени, поэтому должен был спросить здесь.

Ответ №1:

может быть, это может помочь:

 Ogre::String winHandle;
  #ifdef WIN32
  // Windows code
  winHandle  = Ogre::StringConverter::toString((unsigned long)(this->parentWidget()->winId()));
  #else
  // Unix code
  QX11Info info = x11Info();
  winHandle  = Ogre::StringConverter::toString((unsigned long)(info.display()));
  winHandle  = ":";
  winHandle  = Ogre::StringConverter::toString((unsigned int)(info.screen()));
  winHandle  = ":";
  winHandle  = Ogre::StringConverter::toString((unsigned long)(this->parentWidget()->winId()));
  #endif

  Ogre::NameValuePairList params;
  params["parentWindowHandle"] = winHandle;

  mOgreWindow = mOgreRoot->createRenderWindow( "QOgreWidget_RenderWindow",
                           this->width(),
                           this->height(),
                           false,
                           amp;params );
  

QX11Info — это класс Qt, используемый для получения дескриптора.
Дескриптор вставляется в Ogre::NameValuePairList как имя: «parentWindowHandle» значение: ваш дескриптор и десять отправляются в качестве аргумента в OgreRoot::createRenderWindow() . Я попробовал этот код с Qt, и он сработал. Если это не сработает, попробуйте использовать externalWindowHandle в качестве имени параметра.

источник: http://www.ogre3d.org/tikiwiki/QtOgre

Комментарии:

1. Вау, это круто! Спасибо. Мне потребуется некоторое время, чтобы заставить этот код работать и отметить ваш ответ как принятый или проголосовать за него, поскольку я все еще изучаю VC .

2. Ярослав, не мог бы ты помочь немного больше? Я пробовал писать код по-своему, но он создает отдельное окно. Он не отображается в моем окне. Я разместил весь код здесь: ogre3d.org/forums/viewtopic.php?f=2amp;t=67402 и пока не получил никакой реальной помощи.

3. Решил это сам. Ссылка здесь: ogre3d.org/forums/viewtopic.php?f=2amp;t=67402