让Ogre使用外部渲染窗口

15 篇文章 0 订阅
7 篇文章 0 订阅

    就是让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是宽高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值