就是讓Ogre不自己創建渲染窗口,而由第三方來創建。比如C#寫界面、Qt等等。
Ogre::NameValuePairList params;
params["externalWindowHandle"] = Ogre::StringConverter::toString((size_t)(HWND)mWndHandle);
mRoot->initialise(false);
mWindow = mRoot->createRenderWindow("SampleBrowser", mWidth, mHeight, false, ¶ms);
對Ogre的例子瀏覽器SampleBrowser.h的setup函數做了如下修改。
/*-----------------------------------------------------------------------------
| Extends setup to create dummy scene and tray interface.
-----------------------------------------------------------------------------*/
virtual void setup()
{
if(mWndHandle > 0){
Ogre::NameValuePairList params;
params["externalWindowHandle"] = Ogre::StringConverter::toString((size_t)(HWND)mWndHandle);
mRoot->initialise(false);
mWindow = mRoot->createRenderWindow("SampleBrowser", mWidth, mHeight, false, ¶ms);
}
else
if(mWindow == NULL)
mWindow = createWindow();
setupInput(mNoGrabInput);
locateResources();
//...............................
}
另外增加兩個函數以在外部設置窗口大小,傳遞外部窗口句柄。
//! 設置外部窗口句柄
void SetWindowHandle(int handle)
{
mWndHandle = handle;
}
//! 設置外部窗口大小
void SetWindowSize(int width, int height)
{
mWidth = width;
mHeight = height;
}
這樣只需要在setup()調用前,通過SetWindowHandle設置有效的外部窗口句柄,就可以了。
但是爲了混合,我使用了DLL的方式,把SampleBrowser輸出爲了DLL,然後再通過一個全局函數導出。
關鍵代碼就第一段,你想往哪輸出渲染就往哪。在Windows下DLL是一定被支持的,如果你將它弄成組件形式,那就更方便,但會增加易理解性。
C#端,用Kernel32.dll內的
LoadLibrary GetProcAddress 來動態加載DLL內的導出函數。
注意,C#內的委託,相當於函數指針。
public delegate void BrowserMainEx(IntPtr handle, int width, int height);
handle就是窗口句柄了,width,height是寬高。