在Windows平台上将Ogre嵌入到qt应用程序中

时间:2011-02-17 02:00:18

标签: windows qt opengl qglwidget ogre

将Ogre嵌入到qt应用程序中 Link:QtOgre

但它是mac和linux平台,我尝试迁移到Windows平台,但失败了。 我的应用运行如下: enter image description here

enter code here
#ifndef OGREWIDGET_H
#define OGREWIDGET_H
#include "XVQCUGLLIB_Global.h"
#include <QGLWidget>
#include <Ogre/Ogre.h>


class XVQCUGLFXLIB_API OgreWidget : public QGLWidget
{
    //Q_OBJECT;

public:
    OgreWidget( QWidget *parent=0 );
    virtual ~OgreWidget();

protected:
     virtual void initializeGL();
    virtual void resizeGL( int, int );
    virtual void paintGL();

    void init();

    virtual Ogre::RenderSystem* chooseRenderer( Ogre::RenderSystemList* );

    Ogre::Root *mOgreRoot;
    Ogre::RenderWindow *mOgreWindow;
    Ogre::Camera *mCamera;
    Ogre::Viewport *mViewport;
    Ogre::SceneManager *mSceneMgr;
};
#endif // OGREWIDGET_H

///////////////////////////////////////

  #include "XVQCUGLLIB_Internal.h"

 #include "OgreWidget.h"
 #define THIS OgreWidget

 OgreWidget::OgreWidget(QWidget *parent)
     : QGLWidget( parent ),
     mOgreWindow(NULL)
 {
     init();
 }

 OgreWidget::~OgreWidget()
 {
     mOgreRoot->shutdown();
     delete mOgreRoot;
     destroy();
 }

 /**
  * @brief init the object
  * @author kito berg-taylor
  */
      void THIS::init()
      {
   // create the main ogre object
   mOgreRoot = new Ogre::Root;

   mOgreRoot->loadPlugin("RenderSystem_GL_d");
   Ogre::String rName("OpenGL Rendering Subsystem");
   Ogre::RenderSystemList rList = mOgreRoot->getAvailableRenderers();
   Ogre::RenderSystemList::iterator it = rList.begin();
   Ogre::RenderSystem *rSys = 0;
   while(it != rList.end())
   {
       rSys = * (it++);
       Ogre::String strx=rSys->getName();
       if(strx == rName)
       {
           mOgreRoot->setRenderSystem(rSys);
           break;
       }
   }
   mOgreRoot->initialise(false); // don't create a window
 }

 /**
  * @brief setup the rendering context
  * @author Kito Berg-Taylor
  */
 void THIS::initializeGL()
 {

   //== Creating and Acquiring Ogre Window ==//

   // Get the parameters of the window QT created

   Ogre::String winHandle=Ogre::StringConverter::toString((size_t)(HWND)winId());

   Ogre::NameValuePairList params;
   params["parentWindowHandle"] = winHandle;

   mOgreWindow = mOgreRoot->createRenderWindow( "QOgreWidget_RenderWindow",
                            this->width(),
                            this->height(),
                            false,
                            &params );

   //mOgreWindow->setActive(true);
   //WId ogreWinId = 0x0;
   //mOgreWindow->getCustomAttribute( "WINDOW", &ogreWinId );

   //assert( ogreWinId );

   //this->create( ogreWinId );
   setAttribute( Qt::WA_PaintOnScreen, true );
   setAttribute( Qt::WA_NoBackground );

   //== Ogre Initialization ==//
   Ogre::SceneType scene_manager_type = Ogre::ST_EXTERIOR_CLOSE;

   mSceneMgr = mOgreRoot->createSceneManager( scene_manager_type );
   mSceneMgr->setAmbientLight( Ogre::ColourValue(1,1,1) );

   mCamera = mSceneMgr->createCamera( "QOgreWidget_Cam" );
   mCamera->setPosition( Ogre::Vector3(0,1,0) );
   mCamera->lookAt( Ogre::Vector3(0,0,0) );
   mCamera->setNearClipDistance( 1.0 );

   Ogre::Viewport *mViewport = mOgreWindow->addViewport( mCamera );
   mViewport->setBackgroundColour( Ogre::ColourValue( 1.0,1.0,1.0 ) );
 }

 /**
  * @brief render a frame
  * @author Kito Berg-Taylor
  */
 void THIS::paintGL()
 {
     //QGLWidget::paintGL();
   assert( mOgreWindow );


   mOgreRoot->_fireFrameStarted();

  mOgreWindow->update();

  // mOgreRoot->renderOneFrame();

   mOgreRoot->_fireFrameEnded();
 }

 /**
  * @brief resize the GL window
  * @author Kito Berg-Taylor
  */
 void THIS::resizeGL( int width, int height )
 {
//QGLWidget::resizeGL(width,height);
   assert( mOgreWindow );
   mOgreWindow->windowMovedOrResized();
   mCamera->setAspectRatio(Ogre::Real(width) / Ogre::Real(height));
 }

 /**
  * @brief choose the right renderer
  * @author Kito Berg-Taylor
  */
 Ogre::RenderSystem* THIS::chooseRenderer( Ogre::RenderSystemList *renderers )
 {
   // It would probably be wise to do something more friendly 
   // that just use the first available renderer
   return *renderers->begin();
 }

2 个答案:

答案 0 :(得分:0)

你在任何地方调用initializeGL()吗?

IIRC你必须明确地称之为它 - 它不会自动发生

答案 1 :(得分:0)

超越QWidget :: resizeEvent()方法。在该方法中,您会收到窗口大小更改的通知。调整食人魔窗口的大小。