|
用的是网上找的一个ogrewidget类,继承自qwidget FOgerWidget.h - class FOgreWidget : public QWidget
- {
- Q_OBJECT
- public:
- FOgreWidget(QWidget* parent = NULL, QString strInsName = "ogrehead");
- ~FOgreWidget();
- protected:
- // 事件处理函数
- virtual void resizeEvent(QResizeEvent* evt);//窗口可能缩放
- virtual void timerEvent(QTimerEvent* evt);//可以设一时钟来更新窗口
- virtual void paintEvent(QPaintEvent* evt);//呵,当然得处理了
- virtual void keyPressEvent(QKeyEvent* evt);
- virtual void keyReleaseEvent(QKeyEvent *e);
- virtual void mousePressEvent(QMouseEvent* evt);
- virtual void wheelEvent(QWheelEvent* evt);
-
- bool LoadPlugin();
- bool LoadResource();
- bool CreateSceneManager();
- bool CreateRenderWindow();
- bool CreateDefaultCamera();
- bool SelectRenderSystem();
- bool CreateScene();
- void updateDraw();
- void CreateLight();
- std::string GetAppDirectory();
- void SetModeColor(DWORD vColor);
- 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 - FOgreWidget::FOgreWidget(QWidget* parent, QString strInsName)
- : QWidget(parent,Qt::WFlags(Qt::MSWindowsOwnDC | Qt::Widget)),
- 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;
- }
- if(m_pRenderWindow)
- {
- 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::keyReleaseEvent(QKeyEvent *e)
- {
- Ogre::Vector3 v = m_pDefCamera->getDirection();
- v.normalise();
- v *=2;
- m_pDefCamera->moveRelative(v);
- }
- void FOgreWidget::keyPressEvent(QKeyEvent* evt)
- {
- QWidget::keyPressEvent(evt);
- Ogre::Vector3 v = m_pDefCamera->getDirection();
- v.normalise();
- v *=2;
- m_pDefCamera->moveRelative(v);
- }
- 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;
- }
- std::string FOgreWidget::GetAppDirectory()
- {
- return QApplication::applicationDirPath().toStdString() + "/";
- }
- bool FOgreWidget::LoadResource()
- {
- // Load resource paths from config file
- Ogre::ConfigFile cf;
- cf.load(GetAppDirectory() + "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;
- if (i->second.find(":") == -1)
- archName = GetAppDirectory() + i->second;
- else
- 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(12, 8, 2));
- m_pDefCamera->lookAt(Ogre::Vector3(6, 7, 0));
- m_pDefCamera->setNearClipDistance(1);
- 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(NULL == m_pRenderWindow)
- return false;
- return true;
- }
- bool FOgreWidget::Initialize( )
- {
- // already inited
- if(m_pRoot != NULL)
- return true;
- if(NULL == Ogre::Root::getSingletonPtr())
- {
- // create scene root with no config file and plugin
- //m_pRoot = new Root("");
- m_pRoot = new Ogre::Root(GetAppDirectory() + "plugins.cfg",
- GetAppDirectory() + "ogre.cfg",
- GetAppDirectory() + "Ogrelog.cfg");
- // 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())
- // return true;
- // else
- // exit(0);
- return true;
- }
- bool FOgreWidget::CreateScene()
- {
- Ogre::MaterialPtr r
- = Ogre::MaterialManager::getSingleton().create("r",
- Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
- r->setReceiveShadows(false);
- r->getTechnique(0)->setLightingEnabled(true);
- Ogre::Pass* rPass = r->getTechnique(0)->getPass(0);
- rPass->setAmbient(1.0, 1.0, 1.0);
- rPass->setDiffuse(1.0, 0.0, 0.0, 1.0); // 如果需要透明则将alpha值设置成小于1.0即可
- rPass->setSpecular(1.0, 0.0, 0.0, 1.0);
- m_pSceneManager->setSkyBox(true, "Examples/StormySkyBox"); // add a skybox
- // string strName;
- // strName = m_strInsName_.toStdString();
- // strName += ".mesh";
- // m_pMainEnt = m_pSceneManager->createEntity("root_mesh", "a1.mesh");
- // m_pMainEnt = m_pSceneManager->createEntity("root_mesh", "Object03.mesh");
- // m_pMainNode = m_pSceneManager->getRootSceneNode()->createChildSceneNode();
- // Ogre::MaterialPtr a1
- // = Ogre::MaterialManager::getSingleton().load("a1.material",
- // Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
- // //m_pMainEnt->setMaterial(a1);
- // m_pMainNode->attachObject(m_pMainEnt);
- //
- // Ogre::Entity* ent = m_pSceneManager->createEntity("Plane", Ogre::SceneManager::PT_PLANE);
- // ent->setMaterialName("Examples/Frost");
- // Ogre::SceneNode* node = m_pSceneManager->getRootSceneNode()->createChildSceneNode();
- // node->setPosition(0, 0, 50);
- // node->attachObject(ent);
- // DWORD vColor = 0;
- // SetModeColor(vColor);
- 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->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);
- }
- void FOgreWidget::SetModeColor(DWORD vColor)
- {
- if(m_pMainEnt)
- {
- Ogre::MeshPtr tpMesh = m_pMainEnt->getMesh();
- tpMesh->setVertexBufferPolicy(Ogre::HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY,true);
- //遍历对应的模型
- int tSubEngityNum = tpMesh->getNumSubMeshes();
- for(int S = 0 ; S < tSubEngityNum ; S++)
- {
- //
- Ogre::SubMesh* tpSubMesh = tpMesh->getSubMesh(S);
- //锁定顶点缓冲区
- Ogre::VertexData* tVertexData = tpSubMesh->vertexData;
- //色彩
- // size_t tSize3 = 0;
- // size_t tOffSet3 = 0;
- const Ogre::VertexElement* posElem3 =
- tVertexData->vertexDeclaration->findElementBySemantic(Ogre::VES_DIFFUSE);
-
- Ogre::VertexDeclaration::VertexElementList lst
- = tVertexData->vertexDeclaration->getElements();
-
- for (Ogre::VertexDeclaration::VertexElementList::iterator it = lst.begin();
- it != lst.end(); it++)
- {
- Ogre::VertexElement& el = (*it);
- if (el.getType() == Ogre::VET_COLOUR_ARGB)
- {
- Ogre::HardwareVertexBufferSharedPtr dstHVBPos = tVertexData->vertexBufferBinding->getBuffer(posElem3->getSource());
- size_t SizeInBytes = dstHVBPos->getSizeInBytes();
- size_t numVertices = dstHVBPos->getNumVertices();
- size_t SizeVertices = dstHVBPos->getVertexSize();
- size_t VerticesCount= tVertexData->vertexCount;
- unsigned char* pVert = static_cast<unsigned char*>(dstHVBPos->lock(0,
- SizeInBytes ,
- Ogre::HardwareBuffer::HBL_NORMAL));
- float *dstDataPos ;
- //遍历所有顶点
- for(int i = 0 ; i < VerticesCount ; i++, pVert += SizeVertices )
- {
- posElem3->baseVertexPointerToElement(pVert,&dstDataPos);
- Ogre::RGBA tColor = dstDataPos[0];
- //为了验证色彩,我先取得一下查看
- BYTE tRed = tColor >>24;
- BYTE tGreen = (tColor >>16)&0xff;
- BYTE tBlue = (tColor >>8)&0xff;
- BYTE tAlpha = tColor &0xff;
- DWORD tRed2 = 0;
- DWORD tGreen2 = 255;
- DWORD tBlue2 = 0;
- DWORD tAlpha2 = 0;
- DWORD tColor2 =(tRed2 << 24)|(tGreen2 << 16)|(tBlue2 << 8)|tAlpha2 ;
- dstDataPos[0] = tColor2;
- }
- dstHVBPos->unlock();
- break;
- }
- }
- if(posElem3)
- {
- // tSize3 = posElem3->getSize();
- // tOffSet3 = posElem3->getOffset();
- }
- else
- {
- //::MessageBox(NULL,"没有顶点色","提示",MB_OK);
- return;
- }
- Ogre::HardwareVertexBufferSharedPtr dstHVBPos = tVertexData->vertexBufferBinding->getBuffer(posElem3->getSource());
- size_t SizeInBytes = dstHVBPos->getSizeInBytes();
- size_t numVertices = dstHVBPos->getNumVertices();
- size_t SizeVertices = dstHVBPos->getVertexSize();
- size_t VerticesCount= tVertexData->vertexCount;
- unsigned char* pVert = static_cast<unsigned char*>(dstHVBPos->lock(0, SizeInBytes ,
- Ogre::HardwareBuffer::HBL_NORMAL));
- float *dstDataPos ;
- //遍历所有顶点
- for(int i = 0 ; i < VerticesCount ; i++, pVert += SizeVertices )
- {
- posElem3->baseVertexPointerToElement(pVert,&dstDataPos);
- Ogre::RGBA tColor = dstDataPos[0];
- //为了验证色彩,我先取得一下查看
- BYTE tRed = tColor >>24;
- BYTE tGreen = (tColor >>16)&0xff;
- BYTE tBlue = (tColor >>8)&0xff;
- BYTE tAlpha = tColor &0xff;
- DWORD tRed2 = 0;
- DWORD tGreen2 = 255;
- DWORD tBlue2 = 0;
- DWORD tAlpha2 = 255;
- DWORD tColor2 =(tRed2 << 24)|(tGreen2 << 16)|(tBlue2 << 8)|tAlpha2 ;
- dstDataPos[0] = tColor2;
- }
- dstHVBPos->unlock();
- }
-
- }
- }
main中的代码 - QApplication a(argc, argv);
- a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
- QSize qSize = QApplication::desktop()->availableGeometry().size();
- qSize.setHeight(qSize.height() - QT_TITLE_BAR_HEIGHT);
-
- QMainWindow mainwindow;
- QGridLayout layout;
- FOgreWidget ogrewidget(&mainwindow);
- ogrewidget.Initialize();
- layout.addWidget(&ogrewidget, 0, 0, 1, 1);
- mainwindow.setLayout(&layout);
- mainwindow.show();
运行时,FOgreWidget无法响应到mousePressEvent和KeyPressEvent,希望能获得您的帮助,谢谢
|