Bonsoir, j'essaie actuellement d'intégrer Ogre dans une application Qt avec ce tutoriel http://irmatden.developpez.com/tutor...ation-ogre-qt/

je n'ai réalisé que la première partie du tuto (une simple fenêtre avec un menu permettant de changer la couleur de fond) et j'ai déjà des problèmes

en effet après plusieurs modifications, je me heurte toujours au même résultat : tout l'écran devient noir avec juste la fenêtre dont je ne peux pas changer la couleur de fond

voici mon code :

le .pro

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
TEMPLATE = app
TARGET = Qt_Ogre
QT += core gui
INCLUDEPATH = /usr/include/OGRE;
HEADERS += ogrewidget.h
SOURCES += ogrewidget.cpp \
    main.cpp
FORMS += 
RESOURCES += 
unix:LIBS += -lOgreMain
main.cpp:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <QtGui>
 
#include "ogrewidget.h"
 
class MainWindow : public QMainWindow
{
Q_OBJECT
 
public:
    MainWindow()
    :ogreWidget(0)
    {
        ogreWidget = new OgreWidget;
        setCentralWidget(ogreWidget);
 
        QAction *closeAct = new QAction("Quitter", this);
        connect(closeAct, SIGNAL(triggered()), this, SLOT(close()));
 
        QAction *changeColorAct = new QAction("Changer la couleur de fond", this);
        connect(changeColorAct, SIGNAL(triggered()), this, SLOT(chooseBgColor()));
 
        QMenu *menu = menuBar()->addMenu("Divers");
        menu->addAction(changeColorAct);
        menu->addAction(closeAct);
    }
 
private slots:
    void chooseBgColor()
    {
        QColor c = QColorDialog::getColor();
        ogreWidget->setBackgroundColor(c);
    }
 
private:
    OgreWidget *ogreWidget;
}; 
 
#include "main.moc"
 
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    MainWindow window;
    window.show();
    return app.exec();
}
ogrewidget.h:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#ifndef OGREWIDGET_H
#define OGREWIDGET_H
 
#include <Ogre.h>
#include <QtGui>
 
#ifdef Q_WS_X11
  #include <QtGui/QX11Info>
#endif
 
 
 
class OgreWidget : public QWidget
{
    Q_OBJECT
 
public:
    OgreWidget(QWidget *parent = 0);
    ~OgreWidget();
 
public slots:
    void setBackgroundColor(QColor c);
 
protected:
    virtual void moveEvent(QMoveEvent *e);
    virtual QPaintEngine* paintEngine() const;
    virtual void paintEvent(QPaintEvent *e);
    virtual void resizeEvent(QResizeEvent *e);
    virtual void showEvent(QShowEvent *e);
 
private:
    void initOgreSystem();
 
private:
    Ogre::Root         *ogreRoot;
    Ogre::SceneManager *ogreSceneManager;
    Ogre::RenderWindow *ogreRenderWindow;
    Ogre::Viewport     *ogreViewport;
    Ogre::Camera       *ogreCamera;
 
};
 
#endif // OGREWIDGET_H
ogrewidget.cpp (j'ai mis les parties concernant Windows et Apple en commentaire) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include "ogrewidget.h"
 
/*OgreWidget::OgreWidget(QWidget *parent)
 : QWidget(parent)
 {
 //ui.setupUi(this);
 }*/
 
OgreWidget::OgreWidget(QWidget *parent)
:QWidget(parent),
ogreRoot(0), ogreSceneManager(0), ogreRenderWindow(0), ogreViewport(0),
ogreCamera(0)
{
    //setAttribute(Qt::WA_OpaquePaintEvent);
	setAttribute(Qt::WA_NoSystemBackground);
    setAttribute(Qt::WA_PaintOnScreen);
    setMinimumSize(240,240);
}
 
OgreWidget::~OgreWidget()
{
    if(ogreRenderWindow)
    {
        ogreRenderWindow->removeAllViewports();
    }
 
    if(ogreRoot)
    {
        ogreRoot->detachRenderTarget(ogreRenderWindow);
 
        if(ogreSceneManager)
        {
            ogreRoot->destroySceneManager(ogreSceneManager);
        }
    }
 
    delete ogreRoot;
}
 
void OgreWidget::setBackgroundColor(QColor c)
{
    if(ogreViewport)
    {
        Ogre::ColourValue ogreColour;
        ogreColour.setAsARGB(c.rgba());
        ogreViewport->setBackgroundColour(ogreColour);
    }
}
 
void OgreWidget::moveEvent(QMoveEvent *e)
{
    QWidget::moveEvent(e);
 
    if(e->isAccepted() && ogreRenderWindow)
    {
        ogreRenderWindow->windowMovedOrResized();
        update();
    }
}
 
QPaintEngine *OgreWidget:: paintEngine() const
{
    return 0;
}
 
void OgreWidget::paintEvent(QPaintEvent *e)
{
//    ogreRoot->_fireFrameStarted();
//    ogreRenderWindow->update();
//    ogreRoot->_fireFrameEnded();
 
//	ogreRoot->renderOneFrame();
//	ogreRenderWindow->update();
 
//    e->accept();
 
	ogreRoot->_fireFrameStarted();
	ogreRenderWindow->update();
	ogreRoot->_fireFrameRenderingQueued();
	ogreRoot->_fireFrameEnded();
}
 
void OgreWidget::resizeEvent(QResizeEvent *e)
{
    QWidget::resizeEvent(e);
 
    if(e->isAccepted())
    {
        const QSize &newSize = e->size();
        if(ogreRenderWindow)
        {
            ogreRenderWindow->resize(newSize.width(), newSize.height());
            ogreRenderWindow->windowMovedOrResized();
        }
        if(ogreCamera)
        {
            Ogre::Real aspectRatio = Ogre::Real(newSize.width()) / Ogre::Real(newSize.height());
            ogreCamera->setAspectRatio(aspectRatio);
        }
    }
}
 
void OgreWidget::showEvent(QShowEvent *e)
{
    if(!ogreRoot)
    {
        initOgreSystem();
    }
 
    QWidget::showEvent(e);
}
 
void OgreWidget::initOgreSystem()
{
    ogreRoot = new Ogre::Root();
 
    Ogre::RenderSystem *renderSystem = ogreRoot->getRenderSystemByName("OpenGL Rendering Subsystem");
    ogreRoot->setRenderSystem(renderSystem);
    ogreRoot->initialise(true);
 
    ogreSceneManager = ogreRoot->createSceneManager(Ogre::ST_GENERIC);
 
    Ogre::NameValuePairList viewConfig;
    Ogre::String widgethandle;
 
//#ifdef Q_WS_WIN
//    widgetHandle = Ogre::StringConverter::toString((size_t)((HWND)winId()));
//#else
//    QWidget *q_parent = dynamic_cast <QWidget *> (parent());
//    QX11Info xInfo = x11Info();
//
//    widgetHandle = Ogre::StringConverter::toString ((unsigned long)xInfo.display()) +
//        ":" + Ogre::StringConverter::toString ((unsigned int)xInfo.screen()) +
//        ":" + Ogre::StringConverter::toString ((unsigned long)q_parent->winId());
//#endif
//    viewConfig["externalWindowHandle"] = widgetHandle;
 
//#if defined(Q_WS_WIN)
//	//positive integer for W32 (HWND handle) - According to Ogre Docs
//	widgethandle = Ogre::StringConverter::toString((unsigned int)(winId()));
//	viewConfig["externalWindowHandle"] = widgethandle;
//
//#endif
 
#if defined(Q_WS_X11)
		//poslong:posint:poslong:poslong (display*:screen:windowHandle:XVisualInfo*) for GLX - According to Ogre Docs
 
    QWidget *q_parent = dynamic_cast <QWidget *> (parent());
    QX11Info info = x11Info();
		widgethandle  = Ogre::StringConverter::toString((unsigned long)info.display());
		widgethandle += ":";
		widgethandle += Ogre::StringConverter::toString((unsigned int)info.screen());
		widgethandle += ":";
		widgethandle += Ogre::StringConverter::toString((unsigned long)q_parent->winId());
		//widgethandle += ":";
		//widgethandle += Ogre::StringConverter::toString((unsigned long)(info.visual()));
 
		viewConfig["parentWindowHandle"] = widgethandle;
#endif
 
 
//#if defined(Q_WS_MAC)
//
//	widgethandle = Ogre::StringConverter::toString((unsigned int)(winId()));
//	viewConfig["macAPI"] = "cocoa";
//	viewConfig["macAPICocoaUseNSView"] = "true";
//
//#endif
 
    ogreRenderWindow = ogreRoot->createRenderWindow("Ogre rendering window",
		width(), height(), false, &viewConfig);
 
    ogreCamera = ogreSceneManager->createCamera("myCamera");
 
    ogreViewport = ogreRenderWindow->addViewport(ogreCamera);
    ogreViewport->setBackgroundColour(Ogre::ColourValue(0,0,0));
    ogreCamera->setAspectRatio(Ogre::Real(width()) / Ogre::Real(height()));
}
pouvez vous tester et me dire ce qui cloche ?

merci

EDIT: mon EDI avait masqué une partie de main.cpp, rendant le code incompréhensible
c'est corrigé