Je vais essayé d'appliquer ton idée
dans une heure avant j'ai essayé une idée (j'ai pas les erreur mais je vois juste une fenêtre noir)
je vais vous explique l'idée (peut être vous la trouve bonneou vos me conseillé de ne les pas utiliser (je fait confiance de vous conseils ) voilà
1-premièrement j'ai crée une classe (je vais appelé cette classe a chaque fois je veux faire une autre fenêtre) j'ai la essayé pour un seule window
les fonctions essentielles de cette classe sont (init.............
ensuite une autre classe Qogrewidget contient les fonction init , init ressource,create scene.................Code:
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 QOgreRenderWindow::QOgreRenderWindow(QString windowName,Ogre::SceneManager* sceneMgr,QWidget *parent) : QWidget(parent) ,mWindowName(windowName) ,mSceneMgr(sceneMgr) ,mRenderWindow(NULL) ,mCamera(NULL) ,mVp(NULL) { setAttribute(Qt::WA_OpaquePaintEvent); setAttribute(Qt::WA_PaintOnScreen); setAttribute(Qt::WA_NoBackground); setObjectName(windowName); setFocusPolicy(Qt::WheelFocus); } QOgreRenderWindow::~QOgreRenderWindow() { if(mRenderWindow) { mRenderWindow->removeAllViewports(); mSceneMgr->destroyCamera(mCamera); mCamera = 0; mVp = 0; Ogre::Root::getSingleton().detachRenderTarget(mRenderWindow); mRenderWindow=0; this->destroy(); } } void QOgreRenderWindow::paintEvent(QPaintEvent* evt) { QWidget::paintEvent(evt); if(!mRenderWindow) { init(); } mRenderWindow->update(); evt->accept(); } void QOgreRenderWindow::resizeEvent(QResizeEvent* evt) { if(evt->isAccepted()) { if (mRenderWindow) { mCamera->setAspectRatio((float)evt->size().width()/(float)evt->size().height()); mRenderWindow->resize(evt->size().width(), evt->size().height()); mRenderWindow->windowMovedOrResized(); } } QWidget::resizeEvent(evt); } void QOgreRenderWindow::init() { Ogre::NameValuePairList params; Ogre::String winHandle; #ifdef Q_OS_WIN winHandle = Ogre::StringConverter::toString((size_t)((HWND)winId())); #else QX11Info info = x11Info(); winHandle = Ogre::StringConverter::toString((unsigned long)(info.display())); winHandle += ":"; winHandle += Ogre::StringConverter::toString((unsigned int)(info.screen())); winHandle += ":"; winHandle += Ogre::StringConverter::toString((unsigned long)(winId())); #endif params["parentWindowHandle"] = winHandle; mRenderWindow = Ogre::Root::getSingleton().createRenderWindow(mWindowName.toStdString(), width(), height(), false , ¶ms); mRenderWindow->setActive(true); mRenderWindow->resize(width(), height()); mRenderWindow->setVisible( true ); mCamera = mSceneMgr->createCamera("PlayerCam"); // Position it at 500 in Z direction mCamera->setPosition(Ogre::Vector3(-500,0,500)); mCamera->lookAt(Ogre::Vector3(0,0,-300)); mCamera->setNearClipDistance(2); mVp = mRenderWindow->addViewport(mCamera); mVp->setBackgroundColour(Ogre::ColourValue(0,0,0)); }
je fait l'appel de qogrerenderwindow comme ça (une seule dois)Code:
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 void QOgreWidget::init() { mRoot=new Ogre::Root("plugins_d.cfg"); mRoot->loadPlugin("RenderSystem_GL_d"); Ogre::RenderSystem* rs = mRoot->getRenderSystemByName("OpenGL Rendering Subsystem"); if(!(rs->getName() == "OpenGL Rendering Subsystem")) { printf("no susystem"); //No RenderSystem found } //Ogre::RenderSystem *renderSystem = ogreRoot->getRenderSystemByName("ogre_pluginsRenderSystem_GL"); mRoot->setRenderSystem(/*renderSystem*/rs); mRoot->initialise(false); Ogre::NameValuePairList params; Ogre::String winHandle; #ifdef Q_OS_WIN winHandle = Ogre::StringConverter::toString((size_t)((HWND)winId())); #else QX11Info info = x11Info(); winHandle = Ogre::StringConverter::toString((unsigned long)(info.display())); winHandle += ":"; winHandle += Ogre::StringConverter::toString((unsigned int)(info.screen())); winHandle += ":"; winHandle += Ogre::StringConverter::toString((unsigned long)(parentWidget()->winId())); #endif params["parentWindowHandle"] = winHandle; mRenderWindow = Ogre::Root::getSingleton().createRenderWindow("ViewHIDDEN", 1, 1, false , ¶ms); // mRenderWindow->setActive(true); // mRenderWindow->setVisible(false); mSceneMgr = Ogre::Root::getSingleton().createSceneManager(Ogre::ST_GENERIC,"main"); initResources(); createScene(); Ogre::Root::getSingleton().addFrameListener(this); mainProcessID = startTimer(FRAME_TIME*FRAME_NUM); } bool QOgreWidget::frameStarted(const Ogre::FrameEvent& /*evt*/) { return true; } bool QOgreWidget::frameEnded(const Ogre::FrameEvent& /*evt*/) { return true; } void QOgreWidget::initResources() { Ogre::ConfigFile cf; cf.load("resources_d.cfg"); 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); } } Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); } void QOgreWidget::createScene() { if(mSceneMgr) { ogreCube = mSceneMgr->createEntity("cube", Ogre::SceneManager:: PT_CUBE); CubeNode = mSceneMgr->getRootSceneNode()-> createChildSceneNode("CubeNode"); cPosition =Ogre:: Vector3(0.0f,0.0f,0.0f); CubeNode->setPosition(cPosition); //CubeNode->setScale(0.1f, 0.1f, 0.1f); CubeNode->attachObject(ogreCube); } }
mais lors de l’exécution je vois une fenêtre noirCode:
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 void QOgreWidget::setViewNum(int num) { for(int i = 0;i<mQOgreRenderWindowList.count();i++) { delete mQOgreRenderWindowList.takeAt(i); i--; } for(int i = 0; i<mVerticalLayout->count();i++) { delete mVerticalLayout->takeAt(i); i--; } if(num == 1) { QSplitter *Splitter = new QSplitter(this); Splitter->setOrientation(Qt::Vertical); mVerticalLayout->addWidget(Splitter); QOgreRenderWindow *orw = new QOgreRenderWindow(QString("View0"),mSceneMgr,mRoot,Splitter); mQOgreRenderWindowList.append(orw); Splitter->addWidget(orw); }