`
chinamming
  • 浏览: 140175 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

将Ogre写入MFC框架中

 
阅读更多

1. 新建MFC单文档程序
2. 修改项目选项配置
常规 --> 输出目录 --> ../bin/$(ConfigurationName)
常规 --> 中间目录 --> ../obj/$(ConfigurationName)
常规 --> MFC的使用 --> 在静态库中使用MFC
C/C++ --> 预处理器 --> 预处理器定义 --> 增加 _AFXDLL
C/C++ --> 代码生成 --> 运行时库 --> 多线程DLL(/MD)
链接器 --> 附加依赖项 mfc80d.lib OgreMain_d.lib OIS_d.lib
3. 复制ExampleApplication.h 和 ExampleFrameListener.h, 替换类名
4. 替换
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#ifdef _DEBUG
#define OGRE_DEBUG_MEMORY_MANAGER 1
#endif
5. 在APP类中增加成员
MyOgreDemo* theOgreApp;
在函数 InitInstance() 中初始化
theOgreApp = new MyOgreDemo();
在函数 ExitInstance() 中删除
if(theOgreApp)
delete theOgreApp;
6. OgreDemo中增加几个接口函数, 初始化几个变量
void setValue(HWND viewHwnd, HWND mainHwnd, int width, int height)
{
mViewHwnd = viewHwnd; // View的HWND
mMainHwnd = mainHwnd; // 主框架的HWND, 用于鼠标事件
mWidth = width; // 要渲染的大小
mHeight = height;
}
Root* getRoot()
{
return mRoot;
}
7. 增加函数
setupRenderSystem();
增加的渲染系统
createRenderWindow(mHwnd, mWidth, mHeight);
创建了渲染窗口

virtual void setupRenderSystem()
{
Ogre::RenderSystemList::iterator pRend = mRoot->getAvailableRenderers()->begin();
while(pRend != mRoot->getAvailableRenderers()->end())
{
Ogre::String rName = (*pRend)->getName();
if (rName == "OpenGL Rendering Subsystem")
break;
pRend++;
}
Ogre::RenderSystem *rsys = *pRend;
// 配置框中的选项需要手动设置。
rsys->setConfigOption("Colour Depth", "32" );
rsys->setConfigOption( "Full Screen", "No" );
rsys->setConfigOption( "VSync", "No" );
rsys->setConfigOption( "Video Mode", "800 x 600" );
rsys->setConfigOption( "Display Frequency", "60" );
// 起用
mRoot->setRenderSystem( rsys );
}

virtual void createRenderWindow(HWND hWnd, int width, int height)
{
// root初始化的时候,我们可以传入一个false值来告知Root不用给我们自动创建渲染窗口
// 这样我们可以用外部窗口来作为MFC窗口

mRoot->initialise(false);

NameValuePairList miscParams; // 参数列表, 作为createRenderWindow函数的最后一个参数
miscParams["externalWindowHandle"] = StringConverter::toString((long)hWnd);
mWindow = mRoot->createRenderWindow("OgreRenderWindow", width, height, false, &miscParams);
}
8. 重写了监听器的输入系统
// 获得输入系统
size_t windowHnd = 0;
std::ostringstream windowHndStr;
OIS::ParamList pl;
windowHnd = (size_t )mMainHwnd; // 这里这个窗口句柄就是我们传入的MFC主窗口
windowHndStr << windowHnd;
// OIS的窗口必须要顶层窗口,所以只有传MFC的主窗口给他,传view就不行
pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
// 设置鼠标显示和非游戏独占,这样鼠标可以显示在屏幕上并可以移动到窗口外
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")));
mInputManager = OIS::InputManager::createInputSystem(pl);

9. 渲染是通过APP中的OnIdle函数里面调用Root的renderOneFrame()函数实现的

有个缺点, 就是帧率变化幅度很大, 如果愿意用定时器也不错, 只是感觉如果每帧渲染的时间不够容易出现问题
我打算之后的程序两者交替使用

1. 新建MFC单文档程序
2. 修改项目选项配置
常规 --> 输出目录 --> ../bin/$(ConfigurationName)
常规 --> 中间目录 --> ../obj/$(ConfigurationName)
常规 --> MFC的使用 --> 在静态库中使用MFC
C/C++ --> 预处理器 --> 预处理器定义 --> 增加 _AFXDLL
C/C++ --> 代码生成 --> 运行时库 --> 多线程DLL(/MD)
链接器 --> 附加依赖项 mfc80d.lib OgreMain_d.lib OIS_d.lib
3. 复制ExampleApplication.h 和 ExampleFrameListener.h, 替换类名
4. 替换
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#ifdef _DEBUG
#define OGRE_DEBUG_MEMORY_MANAGER 1
#endif
5. 在APP类中增加成员
MyOgreDemo* theOgreApp;
在函数 InitInstance() 中初始化
theOgreApp = new MyOgreDemo();
在函数 ExitInstance() 中删除
if(theOgreApp)
delete theOgreApp;
6. OgreDemo中增加几个接口函数, 初始化几个变量
void setValue(HWND viewHwnd, HWND mainHwnd, int width, int height)
{
mViewHwnd = viewHwnd; // View的HWND
mMainHwnd = mainHwnd; // 主框架的HWND, 用于鼠标事件
mWidth = width; // 要渲染的大小
mHeight = height;
}
Root* getRoot()
{
return mRoot;
}
7. 增加函数
setupRenderSystem();
增加的渲染系统
createRenderWindow(mHwnd, mWidth, mHeight);
创建了渲染窗口

virtual void setupRenderSystem()
{
Ogre::RenderSystemList::iterator pRend = mRoot->getAvailableRenderers()->begin();
while(pRend != mRoot->getAvailableRenderers()->end())
{
Ogre::String rName = (*pRend)->getName();
if (rName == "OpenGL Rendering Subsystem")
break;
pRend++;
}
Ogre::RenderSystem *rsys = *pRend;
// 配置框中的选项需要手动设置。
rsys->setConfigOption("Colour Depth", "32" );
rsys->setConfigOption( "Full Screen", "No" );
rsys->setConfigOption( "VSync", "No" );
rsys->setConfigOption( "Video Mode", "800 x 600" );
rsys->setConfigOption( "Display Frequency", "60" );
// 起用
mRoot->setRenderSystem( rsys );
}

virtual void createRenderWindow(HWND hWnd, int width, int height)
{
// root初始化的时候,我们可以传入一个false值来告知Root不用给我们自动创建渲染窗口
// 这样我们可以用外部窗口来作为MFC窗口

mRoot->initialise(false);

NameValuePairList miscParams; // 参数列表, 作为createRenderWindow函数的最后一个参数
miscParams["externalWindowHandle"] = StringConverter::toString((long)hWnd);
mWindow = mRoot->createRenderWindow("OgreRenderWindow", width, height, false, &miscParams);
}
8. 重写了监听器的输入系统
// 获得输入系统
size_t windowHnd = 0;
std::ostringstream windowHndStr;
OIS::ParamList pl;
windowHnd = (size_t )mMainHwnd; // 这里这个窗口句柄就是我们传入的MFC主窗口
windowHndStr << windowHnd;
// OIS的窗口必须要顶层窗口,所以只有传MFC的主窗口给他,传view就不行
pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
// 设置鼠标显示和非游戏独占,这样鼠标可以显示在屏幕上并可以移动到窗口外
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")));
mInputManager = OIS::InputManager::createInputSystem(pl);

9. 渲染是通过APP中的OnIdle函数里面调用Root的renderOneFrame()函数实现的

有个缺点, 就是帧率变化幅度很大, 如果愿意用定时器也不错, 只是感觉如果每帧渲染的时间不够容易出现问题
我打算之后的程序两者交替使用

分享到:
评论

相关推荐

    ogre+mfc框架程序

    ogre+mfc ogre+mfc框架程序

    Ogre嵌入MFC_DEMO

    本例实现了Ogre嵌入MFC框架,也实现了键盘和鼠标的事件响应。适合初学者学习,我的博客中有详解。

    Ogre+MFC完整框架(附带详细配置)

    该框架为Ogre+MFC的完整框架,能够在xp和Win7系统下正确运行(均测试过),运行环境为VS2005+OgreSDK_1_72。附带详细配置过程和注意事项(包括在xp和win7下的不同补丁和组件),以及常见错误的解决方案。同样适用于...

    OGRE嵌入MFC(代码以及嵌入过程说明)

    该资源的代码除了将OGRE嵌入MFC的部分外还有一些交互的功能,不过基本都是从OGRE SDK里面的实例中参考得来的,非常非常基础,在此就不多描述了,朋友们重点参考嵌入的那部分就好了。 个人感觉这个资源适合于刚接触...

    ogre 嵌入到MFC中

    本教程讲述如何将ogre程序嵌入到mfc中

    OGRE 3D 游戏开发框架指南+光盘源码

    《OGRE 3D游戏开发框架指南(含CD光盘1张)》主要用来帮助读者从一个引擎研究者成为一个游戏开发人员,《OGRE 3D游戏开发框架指南(含CD光盘1张)》的最大特点是依靠代码来推进进度,以三周21天的时间顺序来编排主体内容...

    OGRE嵌入MFC.docx

    OGRE嵌入MFC

    Ogre+MFC.rar_OGRE M_OGRE MFC_OGRE 机器人足球仿真系统_Ogre_ Ogre_ogre

    别人写的东西 拿过来一起去学习研究一下 Ogre与MFC嵌套

    Ogre的游戏框架

    基于OGRE的游戏框架,主要是用状态模式来做的,参考OGRE官网上的教程。

    Ogre嵌入MFC的例子

    Ogre嵌入MFC的demo,该demo是从网上下载的,为了方便大家下载我把它上传了。用的Ogre版本是1.7.2版本

    Ogre - 程序框架

    1. 类似于Ogre-wiki上的set up your first application with CMake(没成功过下载和编译过) 2. Ogre是binary的形式, 不用下载ogre源代码和依赖库 ...4. 基于《Ogre 3d 1.7 beginners' Guide》框架

    Ogre 示例程序框架分析

    本文对Ogre的示例程序框架的源代码进行了分析,展示如何由main开始进入每个示例。

    OGRE嵌入MFC(含代码)

    整理实现了OGRE嵌入MFC的过程,并实现了鼠标点选实体出现包围盒,动画、鼠标滚轮实现缩放,WSAD控制摄像机的前后左右移动功能,还有动态加载OSM,暂时还未加入其中。

    Ogre与MFC整合,不错的东西

    ogre与mfc的整合,需要自己改一下,很不错的东西

    Ogre在MFC下的多窗口实现

    利用MFC的Feature Pack 中的 DockablePane 构造辅助窗口显示 主窗口中的 Scence,达到多窗口显示同一Scence的目的.

    MFC中嵌入Ogre

    可以正确运行的OgreMFC; 在VS2008的环境下,将Ogre嵌入到单文档中;

    Ogre高级框架

    一个搭建好的Ogre游戏开发框架,结构良好,比OgreTutrial里的BaseApplication更适用于开发,学习和使用都很有价值。

    OGRE 3D 游戏开发框架指南+光盘代码.rar

    OGRE 3D 游戏开发框架指南+光盘代码.rar, 很详细,亲测可用!

Global site tag (gtag.js) - Google Analytics