-
UID:77767
-
- 注册时间2009-04-15
- 最后登录2024-02-26
- 在线时间3553小时
-
- 发帖1296
- 搜Ta的帖子
- 精华2
- 金钱26976
- 威望2027
- 贡献值4
- 好评度2014
-
访问TA的空间加好友用道具
|
原帖地址:http://blog.csdn.net/tulun/archive/2010/06/01/5638469.aspx 我用的环境是VS2008+Qt 1,新建一个Qt Application,除了main.cpp文件以外,将其它东西全部删除。 2,添加几个文件如下: FOgreWidget.h:- #include <QWidget>
- // 如果为假就返回
- #ifndef FALSE_RETURN
- #define FALSE_RETURN(h, r) if(!h) return r;
- #endif
- #ifndef _DEGUG
- #define _DEGUG
- #endif
- #include <QEvent>
- #include "Ogre.h"
- #include "OgreConfigFile.h"
- class FOgreWidget : public QWidget
- {
- Q_OBJECT
- public:
- FOgreWidget(QWidget* parent ,QString strInsName);
- ~FOgreWidget();
- //QSize minimumSizeHint() const;
- //QSize sizeHint() const;
- protected:
- // 事件处理函数
- void resizeEvent(QResizeEvent* evt);//窗口可能缩放
- void timerEvent(QTimerEvent* evt);//可以设一时钟来更新窗口
- void paintEvent(QPaintEvent* evt);//呵,当然得处理了
- void keyPressEvent(QKeyEvent* evt);
- //void keyReleaseEvent(QKeyEvent* evt);
- void mousePressEvent(QMouseEvent* evt) ;
- //void mouseReleaseEvent(QMouseEvent* evt);
- //void mouseMoveEvent(QMouseEvent* evt);
- void wheelEvent(QWheelEvent* evt);
- bool LoadPlugin() ;
- bool LoadResource() ;
- bool CreateSceneManager() ;
- bool CreateRenderWindow() ;
- bool CreateDefaultCamera() ;
- bool SelectRenderSystem() ;
- bool CreateScene() ;
- void updateDraw() ;
- void CreateLight() ;
- Ogre::SceneManager* m_pSceneManager ;
- Ogre::RenderWindow* m_pRenderWindow;
- Ogre::Camera* m_pDefCamera;
- Ogre::Viewport* m_pDefViewport;
- Ogre::Root* m_pRoot ;
- Ogre::Entity * m_pMainEnt;
- Ogre::SceneNode* m_pMainNode;
- Ogre::Light* m_pMainLight;
- public :
- bool Initialize() ;
- private:
- QString m_strInsName_ ;
- };
- FOgreWidget.cpp:
- #include "FOgreWidget.h"
- #include <QKeyEvent>
- #include <string>
- using namespace std ;
- FOgreWidget::FOgreWidget(QWidget* parent,QString strInsName) : QWidget(parent,Qt::WFlags(Qt::MSWindowsOwnDC)),m_strInsName_(strInsName)
- {
- m_pSceneManager = NULL ;
- m_pRenderWindow= NULL ;
- m_pDefCamera= NULL ;
- m_pDefViewport= NULL ;
- m_pRoot = NULL ;
- m_pMainEnt= NULL ;
- m_pMainNode= NULL ;
- m_pMainLight = NULL ;
- }
- FOgreWidget::~FOgreWidget()
- {
- // destroy Viewport and RenderWindow
- if( m_pDefViewport )
- {
- m_pRenderWindow->removeViewport(m_pDefViewport->getZOrder());
- m_pDefViewport = NULL ;
- }
- Ogre::Root::getSingleton().detachRenderTarget(m_pRenderWindow);
- m_pRenderWindow = NULL ;
- }
- void FOgreWidget::paintEvent(QPaintEvent *evt)
- {
- Q_UNUSED(evt);
- updateDraw() ;
- }
- void FOgreWidget::timerEvent(QTimerEvent* evt)
- {
- Q_UNUSED(evt);
- updateDraw() ;
- }
- void FOgreWidget::resizeEvent(QResizeEvent *evt)
- {
- QWidget::resizeEvent(evt) ;
- }
- void FOgreWidget::keyPressEvent(QKeyEvent* evt)
- {
- QWidget::keyPressEvent(evt) ;
- }
- void FOgreWidget::mousePressEvent(QMouseEvent* evt)
- {
- QWidget::mousePressEvent(evt) ;
- }
- void FOgreWidget::wheelEvent(QWheelEvent* evt)
- {
- QWidget::wheelEvent(evt) ;
- }
- bool FOgreWidget::LoadPlugin()
- {
- assert(m_pRoot!=NULL) ;
- #if defined(_DEGUG) || defined(DEBUG)
- // Load D3D9 Render System(debug)
- m_pRoot->loadPlugin("RenderSystem_Direct3D9_d");
- // Load OpenGL Render System(debug)
- m_pRoot->loadPlugin("RenderSystem_GL_d");
- // Load partical system(debug)
- m_pRoot->loadPlugin("Plugin_ParticleFX_d");
- // Load octree
- m_pRoot->loadPlugin("Plugin_OctreeSceneManager_d");
- #else
- // Load D3D9 Render System
- m_pRoot->loadPlugin("RenderSystem_Direct3D9");
- // Load OpenGL Render System
- m_pRoot->loadPlugin("RenderSystem_GL");
- // Load partical system
- m_pRoot->loadPlugin("Plugin_ParticleFX");
- // Load octree
- m_pRoot->loadPlugin("Plugin_OctreeSceneManager");
- #endif
- return true;
- }
- bool FOgreWidget::LoadResource()
- {
- // Load resource paths from config file
- Ogre::ConfigFile cf;
- cf.load("resources.cfg");
- // Go through all sections & settings in the file
- Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
- Ogre::String secName, typeName, archName;
- while (seci.hasMoreElements())
- {
- secName = seci.peekNextKey();
- Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
- Ogre::ConfigFile::SettingsMultiMap::iterator i;
- for(i = settings->begin(); i != settings->end(); ++i)
- {
- typeName = i->first;
- archName = i->second;
- Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
- archName, typeName, secName);
- }
- }
- return true;
- }
- bool FOgreWidget::CreateSceneManager()
- {
- assert(m_pRoot);
- m_pSceneManager = m_pRoot->createSceneManager(Ogre::ST_GENERIC);
- return true;
- }
- bool FOgreWidget::CreateDefaultCamera()
- {
- assert(m_pRoot);
- assert(m_pSceneManager);
- assert(m_pRenderWindow);
- //m_pDefCamera = m_pSceneManager->createCamera(strName);
- m_pDefCamera = m_pSceneManager->createCamera("MyCamera");
- m_pDefCamera->setPosition(Ogre::Vector3(0,0,80));
- m_pDefCamera->lookAt(Ogre::Vector3(0,0,-300));
- m_pDefCamera->setNearClipDistance(5);
- m_pDefViewport = m_pRenderWindow->addViewport(m_pDefCamera);
- m_pDefViewport->setBackgroundColour(Ogre::ColourValue(0, 0.0, 0.0, 1));
- m_pDefCamera->setAspectRatio(Ogre::Real(m_pDefViewport->getActualWidth()) / Ogre::Real(m_pDefViewport->getActualHeight()));
- // Make window active and post an update
- m_pRenderWindow->setActive(true);
- m_pRenderWindow->update();
- return true;
- }
- // Create Render Window
- bool FOgreWidget::CreateRenderWindow()
- {
- assert(m_pRoot);
- Ogre::NameValuePairList params;
- params["left"] = "0";
- params["top"] = "0";
- params["border"] = "none";
- //params["externalWindowHandle"] = Ogre::StringConverter::toString((size_t)(HWND)winId());
- params["parentWindowHandle"] = Ogre::StringConverter::toString((size_t)(HWND)winId());
- string strName ;
- strName = m_strInsName_.toStdString() ;
- strName += "_Window" ;
- m_pRenderWindow = m_pRoot->createRenderWindow(strName, width(), height(), false, ¶ms) ;
- if(m_pRenderWindow == NULL) return false;
- return true;
- }
- bool FOgreWidget::Initialize( )
- {
- // already inited
- if(m_pRoot!= NULL) return true ;
- if(Ogre::Root::getSingletonPtr() == NULL)
- {
- // create scene root with no config file and plugin
- //m_pRoot = new Root("");
- m_pRoot = new Ogre::Root();
- // Load plugin
- //FALSE_RETURN( LoadPlugin(), false );
- // Select Render System
- FALSE_RETURN( SelectRenderSystem(), false );
- m_pRoot->initialise(false);
- // Load Resource
- FALSE_RETURN( LoadResource(), false );
- }
- else
- {
- m_pRoot = Ogre::Root::getSingletonPtr();
- }
- // Create Render Window
- FALSE_RETURN( CreateRenderWindow(), false );
- // Create Scene Manager
- FALSE_RETURN( CreateSceneManager(), false );
- // Create Default Camera and Viewport
- FALSE_RETURN( CreateDefaultCamera(), false );
- Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
- // Create Scene
- FALSE_RETURN( CreateScene(), false );
- CreateLight() ;
- startTimer(2);
- return false ;
- }
- // Select Render System
- bool FOgreWidget::SelectRenderSystem()
- {
- m_pRoot->restoreConfig() ;
- if(m_pRoot->showConfigDialog())
- {
- // If returned true, user clicked OK so initialise
- // Here we choose to let the system create a default rendering window by passing 'true'
- return true;
- }
- else
- exit(0);
- return false ;
- }
- bool FOgreWidget::CreateScene()
- {
- string strName ;
- strName = m_strInsName_.toStdString() ;
- strName += ".mesh" ;
- m_pMainEnt = m_pSceneManager->createEntity("root_mesh", strName);
- m_pMainNode = m_pSceneManager->getRootSceneNode()->createChildSceneNode();
- m_pMainNode->attachObject(m_pMainEnt);
- return true ;
- }
- void FOgreWidget::updateDraw()
- {
- if(m_pRenderWindow != NULL)
- {
- //printf("I'm %s\n",m_strInsName_.toStdString().c_str()) ;
- m_pRoot->_fireFrameStarted();
- m_pRenderWindow->update();
- //m_pDefCamera->moveRelative(mDirection);
- //m_pDefCamera->yaw(Ogre::Radian(angleX));
- //m_pDefCamera->pitch(Ogre::Radian(angleY));
- m_pRoot->_fireFrameEnded();
- }
- }
- void FOgreWidget::CreateLight()
- {
- m_pSceneManager->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));
- m_pMainLight = m_pSceneManager->createLight("mainLight");
- m_pMainLight->setPosition(20,80,50);
- }
- main.cpp
- #include <QtGui/QApplication>
- #include "FOgreWidget.h"
- #include <QVBoxLayout>
- #pragma comment( lib, "OgreMain_d.lib")
- #pragma comment( lib, "OIS_d.lib")
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- QWidget widget ;
- widget.setGeometry (10,10,640,480) ;
- FOgreWidget ogreWidget(&widget,QString("ogrehead")) ;
- ogreWidget.setGeometry (10,10,340,280) ;
- ogreWidget.Initialize() ;
- widget.show() ;
-
- a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
- return a.exec();
- }
3,这样就可以了。运行效果如下:
|