您的位置:首页 > 其它

让Ogre使用外部渲染窗口

2014-09-14 08:28 246 查看
就是让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是宽高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: