Historique des modifications - Message

Message #7599

Sujet: Qt et Irrlicht, décidément ils ne s'aimes pas


Type Date Auteur Contenu
Dernière modification 13-12-2009 12:13:55 Gehogor
Bonjour, désolé de ne pas avoir été là plutôt. C'est sans doute trop tard mais on ne sait jamais. Je vais essayer de vous filer des bouts de code qui m'ont permis d'intégrer parfaitement Qt avec Irrlicht, ça fait plusieurs mois que ça tourne. D'ailleurs Tmyke, je ferai ma présentation de projet robotique pendant les vacances de noël afin d'honorer cette section.

Alors je fais simple, voici le .pro pour être vraiment compatible linux et windows:

unix { 
    EXTERNAL = ../local
    LIBS = -lIrrlicht \\
        -lglut \\
        -lXxf86vm
}
win32 { 
    EXTERNAL = ../../../../../Libraries/devel/trunk/
    LIBS = -lIrrlicht \\
        -lqwtd5
}

De plus, j'ai fait tout comme vous un objet GsIrrlicht permettant la fusion des deux libs. Dans cette objet il y a notamment cette initialisation:

void GsIrrlicht::initialisation(QColor l_BackGroundColor, int l_Width, int l_Height,QWidget* Parent)
{
	m_Parent = Parent;

	// Initialisation du moteur3D d'Irrlicht ...
    SIrrlichtCreationParameters Parameters;             // Paramètres d'initialisation vidéo pour Irrlicht
    Parameters.DriverType = video::EDT_OPENGL;		// Choix du driver OpenGL ou DirectX
    Parameters.Bits = 16;
    Parameters.Fullscreen = false;                      // option: pleine écran ou non
    Parameters.Stencilbuffer = true;
    Parameters.Vsync = true;                            // option: synchronisation verticale ou non
    Parameters.AntiAlias = true;                        // option: Anti aliésine ou non
    Parameters.HighPrecisionFPU = false;
    Parameters.EventReceiver = m_ManagerEvent;          // pointeur de l'objet getionnaire d'évènement

    if(m_Parent != NULL)                                // Configuration pour Windows héritant d'un widget parent
    {
    	WId *winID = new WId;
    	*winID = m_Parent->winId();
        Parameters.WindowId = (int*)*winID;		// Avec Linux on fait "parametres.WindowId = winID;"
        m_Device = createDeviceEx(Parameters);		// Création d'Irrlicht avec fenétre QT comme support
        MemIDWin = (int)*winID;
        delete winID;
    }
    else							// Si aucun widget maitre n'est utilisée, on prend la fenêtre d'Irrlicht...
    {
        m_Device = createDevice(    Parameters.DriverType,core::dimension2d< s32 >(l_Width, l_Height),
                                    Parameters.Bits,
                                    Parameters.Fullscreen,
                                    Parameters.Stencilbuffer,
                                    Parameters.Vsync,
                                    m_ManagerEvent);
    }

	m_Device->setResizeAble(true);              // Autorise le redimentionnement de la fenetre
    m_Driver =  m_Device->getVideoDriver();
}

Les variables m_Quelquechose sont privées. La suitre de l'initialisation est comme d'habitude. Maintenant pour rafraichir le rendu 3D, j'utilise soit un timer Qt interne à ce même objet, soit un timer Qt externe car ma fonction "updatFrame()" est un slot public. La voici:

void GsIrrlicht::updateFrame()
{
    if(m_Device->run())
    {
		updateRobot();                  // Mise à jour de tous les robots ou autre chose !!
		updateObject3D();               // Mise à jour des objets 3D. Doit être en premier pour les effets miroires

        m_Driver->beginScene(true, true, SColor(m_BackGroundColor.alpha(),
												m_BackGroundColor.red(),
												m_BackGroundColor.green(),
												m_BackGroundColor.blue()));

		gestionMouvementCamera3D();

        m_Smgr->drawAll();
        m_Guienv->drawAll();

        m_Driver->endScene();
    }
    emit newFrameDone();				// Signal pour indiqué qu'un nuovelle frame vient d'être faite
}

Petit conseil, pour mon application j'ai choisi de créer une fenêtre Irrlicht à coté de celle de Qt car l'utilisation de ID d'Irrlicht n'était pas codée pour linux, seulement pour windows. Les fonctions étaient présentes mais vides. Je ne sais pas si la 1.6 d'Irrlicht est plus complète.

De plus, même sur windows lorsqu'on intègre la fenêtre 3D d'Irrlicht dans la fenêtre Qt, on rencontre des problèmes d'évènements. Il y a des difficultés: on capture mal la position de la souris, il faut ou pas désactivé le mouseTracking de Qt... Bref, j'ai changé de stratégie, j'ai maintenant une fenêtre Irrlicht avec la gestion de ses évènements et une fenêtre Qt pour tous les réglages ou autre. Ce n'est pas une super solution car lorsqu'on a qu'un seul écran d'ordinateur c'est embêtant. Par contre, c'est plus simple à gérer je trouve.

Juste une petite image pour prouver mes dires:



Bonne journée à vous.
Création du message 13-12-2009 09:20:42 Gehogor
Bonjour, désolé de ne pas avoir été là plutôt. C'est sans doute trop tard mais on ne sait jamais. Je vais essayer de vous filer des bouts de code qui m'ont permis d'intégrer parfaitement Qt avec Irrlicht, ça fait plusieurs mois que ça tourne. D'ailleurs Tmyke, je ferai ma présentation de projet robotique pendant les vacances de noël afin d'honorer cette section.

Alors je fais simple, voici le .pro pour être vraiment compatible linux et windows:

unix { 
    EXTERNAL = ../local
    LIBS = -lIrrlicht \\
        -lglut \\
        -lXxf86vm
}
win32 { 
    EXTERNAL = ../../../../../Libraries/devel/trunk/
    LIBS = -lIrrlicht \\
        -lqwtd5
}

De plus, j'ai fait tout comme vous un objet GsIrrlicht permettant la fusion des deux libs. Dans cette objet il y a notamment cette initialisation:

void GsIrrlicht::initialisation(QColor l_BackGroundColor, int l_Width, int l_Height,QWidget* Parent)
{
	m_Parent = Parent;

	// Initialisation du moteur3D d'Irrlicht ...
    SIrrlichtCreationParameters Parameters;             // Paramètres d'initialisation vidéo pour Irrlicht
    Parameters.DriverType = video::EDT_OPENGL;		// Choix du driver OpenGL ou DirectX
    Parameters.Bits = 16;
    Parameters.Fullscreen = false;                      // option: pleine écran ou non
    Parameters.Stencilbuffer = true;
    Parameters.Vsync = true;                            // option: synchronisation verticale ou non
    Parameters.AntiAlias = true;                        // option: Anti aliésine ou non
    Parameters.HighPrecisionFPU = false;
    Parameters.EventReceiver = m_ManagerEvent;          // pointeur de l'objet getionnaire d'évènement

    if(m_Parent != NULL)                                // Configuration pour Windows héritant d'un widget parent
    {
    	WId *winID = new WId;
    	*winID = m_Parent->winId();
        Parameters.WindowId = (int*)*winID;		// Avec Linux on fait "parametres.WindowId = winID;"
        m_Device = createDeviceEx(Parameters);		// Création d'Irrlicht avec fenétre QT comme support
        MemIDWin = (int)*winID;
        delete winID;
    }
    else							// Si aucun widget maitre n'est utilisée, on prend la fenêtre d'Irrlicht...
    {
        m_Device = createDevice(    Parameters.DriverType,core::dimension2d< s32 >(l_Width, l_Height),
                                    Parameters.Bits,
                                    Parameters.Fullscreen,
                                    Parameters.Stencilbuffer,
                                    Parameters.Vsync,
                                    m_ManagerEvent);
    }

	m_Device->setResizeAble(true);              // Autorise le redimentionnement de la fenetre
    m_Driver =  m_Device->getVideoDriver();
}

Les variables m_Quelquechose sont privées. La suitre de l'initialisation est comme d'habitude. Maintenant pour rafraichir le rendu 3D, j'utilise soit un timer Qt interne à ce même objet, soit un timer Qt externe car ma fonction "updatFrame()" est un slot public. La voici:

void GsIrrlicht::updateFrame()
{
    if(m_Device->run())
    {
		updateRobot();                  // Mise à jour de tous les robots ou autre chose !!
		updateObject3D();               // Mise à jour des objets 3D. Doit être en premier pour les effets miroires

        m_Driver->beginScene(true, true, SColor(m_BackGroundColor.alpha(),
												m_BackGroundColor.red(),
												m_BackGroundColor.green(),
												m_BackGroundColor.blue()));

		gestionMouvementCamera3D();

        m_Smgr->drawAll();
        m_Guienv->drawAll();

        m_Driver->endScene();
    }
    emit newFrameDone();				// Signal pour indiqué qu'un nuovelle frame vient d'être faite
}

Petit conseil, pour mon application j'ai choisi de créer une fenêtre Irrlicht à coté de celle de Qt car l'utilisation de ID d'Irrlicht n'était pas codée pour linux, seulement pour windows. Les fonctions étaient présentes mais vides. Je ne sais pas si la 1.6 d'Irrlicht est plus complète.

De plus, même sur windows lorsqu'on intègre la fenêtre 3D d'Irrlicht dans la fenêtre Qt, on rencontre des problèmes d'évènements. Il y a des difficultés: on capture mal la position de la souris, il faut ou pas désactivé le mouseTracking de Qt... Bref, j'ai changé de stratégie, j'ai maintenant une fenêtre Irrlicht avec la gestion de ses évènements et une fenêtre Qt pour tous les réglages ou autre. Ce n'est pas une super solution car lorsqu'on a qu'un seul écran d'ordinateur c'est embêtant. Par contre, c'est plus simple à gérer je trouve.

Juste une petite image pour prouver mes dires:



Bonne journée à vous.

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
142 invités en ligne
membre en ligne: -
RSS Feed