• 12925阅读
  • 1回复

在Qt 中整合Ogre [复制链接]

上一主题 下一主题
离线kimtaikee
 

只看楼主 倒序阅读 楼主  发表于: 2011-05-22

原帖地址:http://blog.csdn.net/tulun/archive/2010/06/01/5638469.aspx
我用的环境是VS2008+Qt
1,新建一个Qt Application,除了main.cpp文件以外,将其它东西全部删除。
2,添加几个文件如下:
FOgreWidget.h:

  1. #include <QWidget>
  2. // 如果为假就返回
  3. #ifndef FALSE_RETURN
  4. #define FALSE_RETURN(h, r) if(!h) return r;
  5. #endif
  6. #ifndef _DEGUG
  7. #define _DEGUG
  8. #endif
  9. #include <QEvent>
  10. #include "Ogre.h"
  11. #include "OgreConfigFile.h"
  12. class FOgreWidget : public QWidget
  13. {
  14. Q_OBJECT
  15. public:
  16. FOgreWidget(QWidget* parent ,QString strInsName);
  17. ~FOgreWidget();
  18. //QSize minimumSizeHint() const;
  19. //QSize sizeHint() const;
  20. protected:
  21. // 事件处理函数
  22. void resizeEvent(QResizeEvent* evt);//窗口可能缩放
  23. void timerEvent(QTimerEvent* evt);//可以设一时钟来更新窗口
  24. void paintEvent(QPaintEvent* evt);//呵,当然得处理了
  25. void keyPressEvent(QKeyEvent* evt);
  26. //void keyReleaseEvent(QKeyEvent* evt);
  27. void mousePressEvent(QMouseEvent* evt) ;
  28. //void mouseReleaseEvent(QMouseEvent* evt);
  29. //void mouseMoveEvent(QMouseEvent* evt);
  30. void wheelEvent(QWheelEvent* evt);
  31. bool LoadPlugin() ;
  32. bool LoadResource() ;
  33. bool CreateSceneManager() ;
  34. bool CreateRenderWindow() ;
  35. bool CreateDefaultCamera() ;
  36. bool SelectRenderSystem() ;
  37. bool CreateScene()  ;
  38. void updateDraw() ;
  39. void CreateLight() ;
  40. Ogre::SceneManager* m_pSceneManager ;
  41. Ogre::RenderWindow* m_pRenderWindow;
  42. Ogre::Camera* m_pDefCamera;    
  43. Ogre::Viewport* m_pDefViewport;  
  44. Ogre::Root* m_pRoot ;    
  45. Ogre::Entity *  m_pMainEnt;  
  46. Ogre::SceneNode*   m_pMainNode;  
  47. Ogre::Light* m_pMainLight;    
  48. public :
  49. bool Initialize() ;
  50. private:
  51. QString  m_strInsName_ ;
  52. };
  53. FOgreWidget.cpp:
  54. #include "FOgreWidget.h"
  55. #include <QKeyEvent>
  56. #include <string>
  57. using namespace std ;
  58. FOgreWidget::FOgreWidget(QWidget* parent,QString strInsName) : QWidget(parent,Qt::WFlags(Qt::MSWindowsOwnDC)),m_strInsName_(strInsName)
  59. {
  60. m_pSceneManager = NULL ;
  61. m_pRenderWindow= NULL ;
  62. m_pDefCamera= NULL ;
  63. m_pDefViewport= NULL ;
  64. m_pRoot = NULL ;
  65. m_pMainEnt= NULL ;
  66. m_pMainNode= NULL ;
  67. m_pMainLight = NULL ;
  68. }
  69. FOgreWidget::~FOgreWidget()
  70. {
  71. // destroy Viewport and RenderWindow
  72. if( m_pDefViewport )
  73. {
  74.   m_pRenderWindow->removeViewport(m_pDefViewport->getZOrder());
  75.   m_pDefViewport = NULL ;
  76. }
  77. Ogre::Root::getSingleton().detachRenderTarget(m_pRenderWindow);
  78. m_pRenderWindow = NULL ;
  79. }
  80. void FOgreWidget::paintEvent(QPaintEvent *evt)
  81. {
  82. Q_UNUSED(evt);  
  83. updateDraw() ;
  84. }
  85. void FOgreWidget::timerEvent(QTimerEvent* evt)
  86. {
  87. Q_UNUSED(evt);
  88. updateDraw() ;
  89. }
  90. void FOgreWidget::resizeEvent(QResizeEvent *evt)
  91. {
  92. QWidget::resizeEvent(evt) ;
  93. }
  94. void FOgreWidget::keyPressEvent(QKeyEvent* evt)
  95. {
  96. QWidget::keyPressEvent(evt) ;
  97. }
  98. void FOgreWidget::mousePressEvent(QMouseEvent* evt)
  99. {
  100. QWidget::mousePressEvent(evt) ;
  101. }
  102. void FOgreWidget::wheelEvent(QWheelEvent* evt)
  103. {
  104. QWidget::wheelEvent(evt) ;
  105. }
  106. bool FOgreWidget::LoadPlugin()
  107. {  
  108. assert(m_pRoot!=NULL) ;
  109. #if defined(_DEGUG) || defined(DEBUG)
  110. // Load D3D9 Render System(debug)
  111. m_pRoot->loadPlugin("RenderSystem_Direct3D9_d");
  112. // Load OpenGL Render System(debug)
  113. m_pRoot->loadPlugin("RenderSystem_GL_d");
  114. // Load partical system(debug)
  115. m_pRoot->loadPlugin("Plugin_ParticleFX_d");
  116. // Load octree
  117. m_pRoot->loadPlugin("Plugin_OctreeSceneManager_d");
  118. #else
  119. // Load D3D9 Render System
  120. m_pRoot->loadPlugin("RenderSystem_Direct3D9");
  121. // Load OpenGL Render System
  122. m_pRoot->loadPlugin("RenderSystem_GL");
  123. // Load partical system
  124. m_pRoot->loadPlugin("Plugin_ParticleFX");
  125. // Load octree
  126. m_pRoot->loadPlugin("Plugin_OctreeSceneManager");
  127. #endif  
  128. return true;
  129. }
  130. bool FOgreWidget::LoadResource()
  131. {
  132. // Load resource paths from config file
  133. Ogre::ConfigFile cf;
  134. cf.load("resources.cfg");
  135. // Go through all sections & settings in the file
  136. Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
  137. Ogre::String secName, typeName, archName;
  138. while (seci.hasMoreElements())
  139. {
  140.   secName = seci.peekNextKey();
  141.   Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
  142.   Ogre::ConfigFile::SettingsMultiMap::iterator i;
  143.   for(i = settings->begin(); i != settings->end(); ++i)
  144.   {
  145.    typeName = i->first;
  146.    archName = i->second;
  147.    Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
  148.     archName, typeName, secName);
  149.   }
  150. }
  151. return true;
  152. }
  153. bool FOgreWidget::CreateSceneManager()
  154. {
  155. assert(m_pRoot);
  156. m_pSceneManager = m_pRoot->createSceneManager(Ogre::ST_GENERIC);
  157. return true;
  158. }
  159. bool FOgreWidget::CreateDefaultCamera()
  160. {
  161. assert(m_pRoot);
  162. assert(m_pSceneManager);
  163. assert(m_pRenderWindow);
  164. //m_pDefCamera = m_pSceneManager->createCamera(strName);
  165. m_pDefCamera = m_pSceneManager->createCamera("MyCamera");
  166. m_pDefCamera->setPosition(Ogre::Vector3(0,0,80));
  167. m_pDefCamera->lookAt(Ogre::Vector3(0,0,-300));
  168. m_pDefCamera->setNearClipDistance(5);
  169. m_pDefViewport = m_pRenderWindow->addViewport(m_pDefCamera);
  170. m_pDefViewport->setBackgroundColour(Ogre::ColourValue(0, 0.0, 0.0, 1));
  171. m_pDefCamera->setAspectRatio(Ogre::Real(m_pDefViewport->getActualWidth()) / Ogre::Real(m_pDefViewport->getActualHeight()));
  172. // Make window active and post an update
  173. m_pRenderWindow->setActive(true);
  174. m_pRenderWindow->update();
  175. return true;
  176. }
  177. // Create Render Window
  178. bool FOgreWidget::CreateRenderWindow()
  179. {
  180. assert(m_pRoot);
  181. Ogre::NameValuePairList params;
  182. params["left"]                 = "0";
  183. params["top"]                  = "0";
  184. params["border"]               = "none";
  185. //params["externalWindowHandle"] = Ogre::StringConverter::toString((size_t)(HWND)winId());
  186. params["parentWindowHandle"] = Ogre::StringConverter::toString((size_t)(HWND)winId());
  187. string strName  ;
  188. strName = m_strInsName_.toStdString() ;
  189. strName += "_Window" ;
  190. m_pRenderWindow = m_pRoot->createRenderWindow(strName, width(), height(), false, &params) ;
  191. if(m_pRenderWindow == NULL) return false;
  192. return true;
  193. }
  194. bool FOgreWidget::Initialize( )
  195. {
  196. // already inited
  197. if(m_pRoot!= NULL) return true ;
  198. if(Ogre::Root::getSingletonPtr() == NULL)
  199. {
  200.   // create scene root with no config file and plugin
  201.   //m_pRoot = new Root("");
  202.   m_pRoot = new Ogre::Root();
  203.   // Load plugin
  204.   //FALSE_RETURN( LoadPlugin(), false );
  205.   // Select Render System
  206.   FALSE_RETURN( SelectRenderSystem(), false );
  207.   m_pRoot->initialise(false);
  208.   // Load Resource
  209.   FALSE_RETURN( LoadResource(), false );
  210. }      
  211. else
  212. {
  213.   m_pRoot = Ogre::Root::getSingletonPtr();
  214. }  
  215. // Create Render Window
  216. FALSE_RETURN( CreateRenderWindow(), false );
  217. // Create Scene Manager
  218. FALSE_RETURN( CreateSceneManager(), false );
  219. // Create Default Camera and Viewport
  220. FALSE_RETURN( CreateDefaultCamera(), false );
  221. Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
  222. // Create Scene
  223. FALSE_RETURN( CreateScene(), false );
  224. CreateLight() ;
  225. startTimer(2);
  226. return false ;
  227. }  
  228. // Select Render System
  229. bool FOgreWidget::SelectRenderSystem()
  230. {
  231. m_pRoot->restoreConfig() ;
  232. if(m_pRoot->showConfigDialog())
  233. {
  234.   // If returned true, user clicked OK so initialise
  235.   // Here we choose to let the system create a default rendering window by passing 'true'
  236.   return true;
  237. }
  238. else
  239.   exit(0);
  240. return false ;
  241. }
  242. bool FOgreWidget::CreateScene()
  243. {
  244. string strName  ;
  245. strName = m_strInsName_.toStdString() ;
  246. strName += ".mesh" ;
  247. m_pMainEnt = m_pSceneManager->createEntity("root_mesh", strName);
  248. m_pMainNode = m_pSceneManager->getRootSceneNode()->createChildSceneNode();
  249. m_pMainNode->attachObject(m_pMainEnt);
  250. return true ;
  251. }
  252. void FOgreWidget::updateDraw()
  253. {
  254. if(m_pRenderWindow != NULL)
  255. {
  256.   //printf("I'm %s\n",m_strInsName_.toStdString().c_str()) ;
  257.   m_pRoot->_fireFrameStarted();
  258.   m_pRenderWindow->update();
  259.   //m_pDefCamera->moveRelative(mDirection);
  260.   //m_pDefCamera->yaw(Ogre::Radian(angleX));
  261.   //m_pDefCamera->pitch(Ogre::Radian(angleY));
  262.   m_pRoot->_fireFrameEnded();
  263. }
  264. }
  265. void FOgreWidget::CreateLight()
  266. {
  267. m_pSceneManager->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));
  268. m_pMainLight = m_pSceneManager->createLight("mainLight");
  269. m_pMainLight->setPosition(20,80,50);
  270. }
  271. main.cpp
  272. #include <QtGui/QApplication>
  273. #include "FOgreWidget.h"
  274. #include <QVBoxLayout>
  275. #pragma comment( lib, "OgreMain_d.lib")
  276. #pragma comment( lib, "OIS_d.lib")
  277. int main(int argc, char *argv[])
  278. {
  279. QApplication a(argc, argv);
  280. QWidget widget ;
  281. widget.setGeometry (10,10,640,480) ;
  282. FOgreWidget ogreWidget(&widget,QString("ogrehead")) ;
  283. ogreWidget.setGeometry (10,10,340,280) ;
  284. ogreWidget.Initialize() ;
  285. widget.show() ;
  286. a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
  287. return a.exec();
  288. }

3,这样就可以了。运行效果如下:



离线ppdayz

只看该作者 1楼 发表于: 2011-05-23
学习了
快速回复
限100 字节
 
上一个 下一个