Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.7.1 - Qt Creator : 4.2.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

[Qt4] Qt et Ogre3D et destructeur

Bonjour,
J'ai récupéré un bout code qui encapsule une fenetre Ogre3D (en OpenGL je suis sous linux) dans un QWidget.
En gros c'est branché comme ca :

WId window_id;
//ogre renderWindow
mRenderWindow->getCustomAttribute("GLXWINDOW", &window_id);
QWidget::create(window_id);
Le probleme que j'ai vient à la destruction du widget.
ou j'ai :

Unloading library /local/soft/ogre/lib/OGRE/RenderSystem_GL.so
Unregistering ResourceManager for type Material
Unloading library libOgrePlatform.so
X Error of failed request: RenderBadPicture (invalid Picture parameter)
Major opcode of failed request: 158 (RENDER)
Minor opcode of failed request: 7 (RenderFreePicture)
Picture id in failed request: 0x5c0006d
Serial number of failed request: 4769
Current serial number in output stream: 4817


Donc Qt a l'air de vouloir faire un rendu de la fenetre.
Donc j'ai fait un hide dans le destructeur avant de detruire ogre mais ca marche pas mieux..

Any idea ?
«1

Réponses

  • Salut,

    Ce n'est pas à Ogre de créer la fenêtre pour Qt, c'est l'inverse ;)
    Regarde le tout début d'un poste plus vieux ici; j'indique les attributs à donner.
  • En fait j'ai bien ce bout là, du createRenderWindow, d'ailleurs ca vient du shomesh de Ogre en QT
  • Exact, alors pouquoi ce QWidget::create(window_id)??? Il n'a pas de sens.
  • Au fait, ShowMesh était écrit avec Qt3, avec Qt4 je n'ai pas suivi le même "process" mais je n'avais aucun plantage :)
  • héhé, en fait j'ai repris le code du showMesh avec Qt4 pour faire un Editeur de Scene.
    C'est pas moi qui ai rajouté le create(window_id) ...
    je vais l'enlever pour voir si ca change qqchose...

    Et Comme il manquait
    setAttribute( Qt::WA_DeleteOnClose );

    on ne rentrait jamais dans le destructeur d'Ogre...
  • En fait c'est specifique à la version sous linux :

    #if !defined(Q_WS_WIN) // Linux
    WId window_id;
    mRenderWindow->getCustomAttribute("GLXWINDOW", &window_id);

    // Take over the ogre created window.
    QWidget::create(window_id);

    mRenderWindow->reposition(x(),y());
    #endif
    Donc si j'enleve la ligne create, j'ai plus la fenetre de renduOgre (ou un petit bout seulement).
    Mais par contre il n'y as plus de problemes à la destruction ;)
  • glups :/
    Désolé je ne pourrais pas t'aider, étant sous win.
  • En fait si je comme toi en enlevant le create ca me donne :

    0x00cbf2d3 in XCloseDisplay () from /usr/X11R6/lib/libX11.so.6
    #2 0x0103a7c7 in qt_cleanup () at kernel/qapplication_x11.cpp:2024
    #3 0x00fed959 in ~QApplication (this=0xbfb9dedc) at kernel/qapplication.cpp:913


    Par contre est-ce que sous win, en rajouttant dans la MainWindow le
    setAttribute( Qt::WA_DeleteOnClose );

    tu arrives à bien fermer le showmesh ?
  • En fait, je ne me suis jamais basé sur son code :D
    J'ai commencé en reprenant tout de 0 pour faire un wrapper Ogre pour Qt, de façon à avoir une meilleure séparation des types (genre pas avoir root lié à la fenêtre ;)), et pouvoir donc avoir plusieurs renderwindow.
    Malheureusement, c'est franchement en suspens en ce moment, et je me suis arrêté au premier tests :'(

    Je te dirais ce soir quand j'aurais mon code sous les yeux ;)
  • OK merci en tout cas
  • Bon, je viens de récupérer la dernière version de ShowMesh, et je viens de voir qu'il l'a passé en Qt4. Par contre, j'ai un super bunch d'error à la compilation (qui plus est dans les 3 classes Qt :()
    Bref, je vais insister un peu.

    Pour ce qui est de ce que j'avais fait, ça fonctionne à part des modifs laissées en plan ;)
    En fait, Ogre::Root est membre de QMainWindow, et je n'ai absolument pas déclaré le WA_DeleteOnClose, et tout se passe bien.
    Par contre, j'utilisais actuellement Ogre 1.2.2. Tu utilises quelle version?
  • Y'a du mieux, j'ai pu le compiler :)
    ...
    Mais il crash au démarrage :(
    Je verrais ça pour demain soir du coup.
  • J'ai utilisé la version 1.21 et maintenant la 1.2.4...
    Tu as verifié qu'il passait dans le destructeur du ogreview avec un cout ?

    Merci en tout cas et dsl pour le temps perdu ...
  • Ben non. Vu que ShowMesh crash au démarrage, j'ai pas de chances de le lancer. :D
    Pour le destructeur, je t'ai dit que j'avais testé avec mon code, pas ShowMesh.
  • OK, bé c'est bizarre alors...
    Sinon pour le crash, je jetterai un coup d'oeil au log Ogre si tu veux ...
  • Déjà fait, mais il était trop tard pour que je trace :)
    Le crash se produit juste après (ou pendant) le createRenderWindow vu que c'est la dernière ligne du log. Si je rentre pas trop tard, j'essaie de debugger ça ce soir.
  • Bon, ben, ça commence mal: conflit de type entre Qt et Ogre pour les couleurs (je pensais avoir réglé ça en même temps que le uint hier soir) :'(
    Et pis, quand ça continue, ça continue bien, ça crash sur mRoot = new Ogre::Root(); re :'(

    Je comprends pas image
  • December 2006 modifié
    Je peux te filer une version light si tu veux, ou il y a juste le MainWindow et un OgreView qui fait pas grand chose...
    Merci pour tes efforts ...
  • Volontier, ce sera ptet plus simple à tracer :)
  • Ok désolé pour le retard, j'avais qq RTT à rattraper ;)
    Donc je t'ai tout mis ici :
    http://www.irisa.fr/siames/GENS/xlarrode/ogre/testOgre.zip

    Donc quand tu auras 2 min...
  • Oki, je verrais ça dès que possible :)
  • Grrrr image
    Les mêmes problèmes qu'avec ShowMesh (au hasard) :'(

    Il râle à propos de QLinkedList :
        "D:\prog\Microsoft Visual Studio 8\VC\BIN\nmake.exe" -f Makefile.Debug
    cl -c -nologo -Zm200 -Od -ZI -Gm -MDd -GR -GX -W3 -DUNICODE -DQT_LARGEFILE_SUPPORT -DWIN32 -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"D:/prog/Librairies/Qt-4.2.0/include/QtCore" -I"D:/prog/Librairies/Qt-4.2.0/include/QtCore" -I"D:/prog/Librairies/Qt-4.2.0/include/QtGui" -I"D:/prog/Librairies/Qt-4.2.0/include/QtGui" -I"D:/prog/Librairies/Qt-4.2.0/include" -I"." -I"D:/prog/Librairies/OgreSDK/include" -I"D:/prog/Librairies/Qt-4.2.0/include/ActiveQt" -I"debug" -I"." -I"d:\prog\Librairies\Qt-4.2.0\mkspecs\win32-msvc" -Fodebug\ @C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\nm1C.tmp
    ogreview.cpp
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qlinkedlist.h(225) : error C2143: syntax error : missing ';' before '.'
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qlinkedlist.h(226) : see reference to class template instantiation 'QLinkedList<T>' being compiled
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qlinkedlist.h(225) : error C3254: 'QLinkedList<T>' : class contains explicit override 'instance' but does not derive from an interface that contains the function declaration
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qlinkedlist.h(225) : error C2838: 'instance' : illegal qualified name in member declaration
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qlinkedlist.h(225) : error C2238: unexpected token(s) preceding ';'
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qlinkedlist.h(260) : error C2589: '::' : illegal token on right side of '::'
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qlinkedlist.h(260) : error C2988: unrecognizable template declaration/definition
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qlinkedlist.h(260) : error C2059: syntax error : '::'
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qlinkedlist.h(276) : error C2143: syntax error : missing ';' before '{'
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qlinkedlist.h(276) : error C2447: '{' : missing function header (old-style formal list?)
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qvarlengtharray.h(96) : error C2143: syntax error : missing ';' before '.'
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qvarlengtharray.h(107) : see reference to class template instantiation 'QVarLengthArray<T,Prealloc>' being compiled
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qvarlengtharray.h(96) : error C3254: 'QVarLengthArray<T,Prealloc>' : class contains explicit override 'instance' but does not derive from an interface that contains the function declaration
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qvarlengtharray.h(96) : error C2838: 'instance' : illegal qualified name in member declaration
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qvarlengtharray.h(96) : error C2238: unexpected token(s) preceding ';'
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qvarlengtharray.h(155) : error C2589: '::' : illegal token on right side of '::'
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qvarlengtharray.h(155) : error C2988: unrecognizable template declaration/definition
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qvarlengtharray.h(155) : error C2059: syntax error : '::'
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qshareddata.h(41) : error C2327: 'QSharedData::ref' : is not a type name, static, or enumerator
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qshareddata.h(41) : error C3861: 'ref': identifier not found
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qshareddata.h(41) : error C2433: 'QSharedData::QSharedData' : 'inline' not permitted on data declarations
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qshareddata.h(41) : error C2461: 'QSharedData' : constructor syntax missing formal parameters
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qshareddata.h(41) : error C2473: '{ctor}' : looks like a function definition, but there is no parameter list.
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qshareddata.h(42) : error C2550: 'QSharedData' : constructor initializer lists are only allowed on constructor definitions
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qshareddata.h(44) : error C2059: syntax error : 'private'
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qshareddata.h(46) : error C2143: syntax error : missing ';' before '&'
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qshareddata.h(46) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qshareddata.h(46) : error C2143: syntax error : missing ',' before '&'
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qshareddata.h(47) : error C2059: syntax error : '}'
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qshareddata.h(47) : error C2143: syntax error : missing ';' before '}'
    d:\prog\librairies\qt-4.2.0\src\corelib\tools\qshareddata.h(47) : error C2059: syntax error : '}'
    Ca me dépasse complétement :(

    T'auras sans doute mieux à faire de poser directement la question sur le thread de showmesh...

    Sinon, je suis en train de downloader Ogre 1.2.4, histoire de voir... A tout hasard... :)

    Edit: Bon, c'est sans espoir :/
  • Probablement une macro de ShowMesh qui redéfinit free, ou quelque chose comme ça.
    Il faut juste faire attention dans les sources de ShowMesh à include les *.h de Qt avant ceux de ShowMesh.
  • December 2006 modifié
    ShowMesh est en fait une appli permettant l'affichage de modèle au format Ogre.
    En fait, c'est Ogre qui redéfinit les opérateurs d'(dés)allocations pour surveiller les leaks. Il y a bien quelque chose pour désactiver les macros mémoires ;) (je n'avais pas pensé à ça alors que j'avasi déjà eu le cas il y a quelques temps, je m'auto-descerne le Boulet d'Or :)).

    edit: Bon, ça avance, maintenant ça ne crash plus qu'au premier affichage :D
    Mais dodo maintenant...
  • Putain c'est le bordel ... On a eu le meme probleme pour notre platforme sous windows, lorsqu'on a integré ogre...
    Bé encore merci, et dsl pour tes heures de sommeil qui en prennent en coup ;)
  • December 2006 modifié
    Bizarre qu'il n'y ait pas ces problèmes sous linux. Vous avez testé plusieurs plateformes?
    Le plus étonnant est qu'il y a une solution VS 2005 (version pro, donc je ne peux pas la tester); donc ça a du fonctionner d'une façon ou d'une autre. Reste à savoir quel miracle y est contenu :)

    Edit: xabi, quand tu fournis des exemples peut-tu le faire de façon indépendante de tout autre "chose" stp? Je pense tout particulièrement à cmake là (pas Ogre, sinon, c'est clair que l'archive serait super lourde ;))
  • cmake c'est juste pour generer les Makefile,vcproj...,
    tu as deux fichiers cpp et deux .h + le fichier de ressource, donc si tu veux pas te servir de cmake pour generer ton vcproj, tu le fais à la main ;) ou avec qmake.
  • C'est ce que j'ai fais, mais c'est plus cool pour ceux qui récupère l'archive de ne rien avoir à faire d'autre que qmake && make (ou équivalent).
    Sans compter les modifs du pro pour spécifier les chemins des headers et libs bien sûr :)
  • Mais l'objectif c'est pas de distribuer mon exemple qui ne fait pas grand chose vu que le but c'est de comprendre pourquoi le destructeur plante ;)
    Mais j'y reflechirai le jour ou je distribuerai le sceneViewer, bien que pour moi cmake suffit si les fichiers find sont bien fait...
  • Je parle pas de distribution finale, je parle du seul dénominateur commun à tous les utilisateurs Qt (et donc forumeurs susceptible d'aider): qmake.

    Y'a rien de plus agréable qu'un exemple pour lequel tu compiles en tapant une ligne, là faut se retaper un project à créer, voir où sont placés les fichiers etc... C'est juste une question de se mettre à la place du gars en face qui prend un peu de son temps pour aider; c'est sympa de faciliter la vie quoi ;)
Connectez-vous ou Inscrivez-vous pour répondre.