Autor Wątek: [Qt] Ogre3d - renderowanie do okna Qt  (Przeczytany 1377 razy)

Offline bonifacy

  • Użytkownik

# Luty 04, 2012, 22:43:14
Witam
Od dwóch dni męcze się nad integracja Ogre3d i Qt widgets. Mam klasę Engine w której konfiguruje i odpalam sobie Ogra.  I mam druga klasę OgreWidget która wygląda tak:

OgreWidget::OgreWidget(QWidget* parent) : QWidget(parent)
{
    setAttribute(Qt::WA_PaintOnScreen);
    setAttribute(Qt::WA_OpaquePaintEvent);
setAttribute(Qt::WA_NoBackground);
    setAttribute(Qt::WA_NoSystemBackground);

    resize(800,600);

    setFocusPolicy(Qt::StrongFocus);

if(!g_engine || !g_engine->init(WId(), width(), height()))
{
QMessageBox msg;
msg.setText("Dupa zbita.");
msg.setIcon(QMessageBox::Critical);
msg.exec();
}
else
{
m_timer.setInterval(10);
connect(&m_timer, SIGNAL(timeout()), this, SLOT(repaint()));
m_timer.start();
}
}

OgreWidget::~OgreWidget()
{

}

QPaintEngine* OgreWidget::paintEngine() const
{
return nullptr;
}

void OgreWidget::paintEvent(QPaintEvent* e)
{
if(!g_engine)
{
return;
}

g_engine->update();
e->accept();
}

void OgreWidget::resizeEvent(QResizeEvent* e)
{
QWidget::resizeEvent(e);

if(e->isAccepted())
    {       
if(g_engine)
{
const QSize& newSize = e->size();
g_engine->resizeView(newSize.width(), newSize.height());
}
    }
}

OgreWidget* g_ogreWidget;

Wszystko się ładnie odpala ale Ogre nie chce renderowac do podanego widgetu (widget jest biały). Z logów wynika, że silnik się odpala. Gdy do klasy Engine zamiast uchwytu okna podam null'a Ogr odpala swoje okno i do niego renderuje wiec w tej klasie jest chyba wszystko ok. Co może byc powodem, że jak podam silnikowi uchwyt do okna widgetu to nic w nim nie wyświetla?

Zapewne coś robię źle w OgreWidget lub w samym mainie, którego podaje niżej:

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

g_mainWindow = new MainWindow();

g_engine = new Engine();

g_ogreWidget = new OgreWidget(g_mainWindow->getUI()->renderWindow);

g_ogreWidget->resize(800, 600);
g_ogreWidget->show();
g_ogreWidget->setFocus();

g_mainWindow->setCentralWidget(g_ogreWidget);
g_mainWindow->show();

return a.exec();
}

renderWindow to utworzony w qtCreatorze widget. Wcześniej jak używałem Irrlichta to nie było problemu. Jakieś pomysły?

I jeszcze na koniec, jakby ktoś chciał zobaczyc metode init() klasy engine:

bool Engine::init(WId windowHandle, int sizeX, int sizeY)
{
if(m_run)
{
return false;
}

#ifdef _DEBUG
m_root = new Ogre::Root("plugins_d.cfg");
#else
m_root = new Ogre::Root("plugins.cfg");
#endif

if(!m_root)
{
return false;
}

Ogre::RenderSystem *renderSystem = m_root->getRenderSystemByName("Direct3D9 Rendering Subsystem");

if(!renderSystem)
{
return false;
}

m_root->setRenderSystem(renderSystem);
renderSystem->setConfigOption("Video Mode", "800 x 600");

m_root->initialise(false);

m_sceneMgr = m_root->createSceneManager(Ogre::ST_GENERIC);

if(!m_sceneMgr)
{
return false;
}

Ogre::NameValuePairList viewConfig;
    Ogre::String widgetHandle;

widgetHandle += Ogre::StringConverter::toString((unsigned long)(windowHandle));

viewConfig["externalWindowHandle"] = widgetHandle;
viewConfig["useNVPerfHUD"] = "true";

m_renderWindow = m_root->createRenderWindow("Rendering window", sizeX, sizeY, false, &viewConfig);

if(!m_renderWindow)
{
return false;
}

m_renderWindow->setActive(true);

m_camera = m_sceneMgr->createCamera("MainCamera");

if(!m_camera)
{
return false;
}

m_camera->setNearClipDistance(1.0f);
m_camera->setFixedYawAxis(false);
m_camera->setPosition(10.0f, 10.0f, 0.0f);
m_camera->lookAt(0.0f, 0.0f, 0.0f);

m_viewport = m_renderWindow->addViewport(m_camera);
m_camera->setAspectRatio(Ogre::Real(m_viewport->getActualWidth()) / Ogre::Real(m_viewport->getActualHeight()));

if(!m_viewport)
{
return false;
}

m_viewport->setBackgroundColour(Ogre::ColourValue(50.0f, 50.0f, 50.0f));

setupResources();
createScene();

m_run = true;

return true;
}

Aha i oczywiscie ekran updatuje kodem:
m_root->_fireFrameStarted();
m_renderWindow->update();
m_root->_fireFrameRenderingQueued();
m_root->_fireFrameEnded();

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline bonifacy

  • Użytkownik

# Luty 05, 2012, 00:40:07
Problem rozwiązany.

Zamiast:
g_ogreWidget = new OgreWidget(g_mainWindow->getUI()->renderWindow);

Trzeba było dac:
g_ogreWidget = new OgreWidget(g_mainWindow);

Dziwne, że po dwóch dniach dopiero do tego doszedłem :p