IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

[SOURCE][SDL][OPENGL]Singleton pour gérer le fenêtrage


Sujet :

Contribuez

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut [SOURCE][SDL][OPENGL]Singleton pour gérer le fenêtrage
    Bonjour,

    voici une proposition de code source :
    un singleton pour gérer le fenêtrage OpenGL en utilisant la SDL afin de conserver la portabilité du code

    pour ce qui est du langage et des bibliothèques :
    - qui dit singleton dit C++
    - quelques fonctions de la SDL, bien sur pour l'initialiser mais aussi pour tester l'initialisation
    - des fonctions SDL propres à OpenGL
    - un peu de gestion du temps avec la SDL
    - une forme basique d'exception, libre à vous de complexifier la chose pour l'améliorer
    - un peu d'OpenGL pour paramétrer l'affichage (frustum + perspective) et afficher un triangle (tutorial 3 de nehe)

    je n'ai pas voulu faire trop compliqué mais assez pour que ce soit utile et utilisable dans l'état tout en restant facilement modifiable
    le zip contient également un main afin que vous puissiez le tester et voir comment l'utiliser

    j'espère avoir suffisement commenté la chose
    dites moi ce que vous en pensez et s'il y a des bugs à corriger

    [edit] j'ai oublié de préciser, basculer du mode fenêtré au mode plein écran et/ou vice-versa ne fonctionne pas sous windows
    quelqu'un pourrait-il me confirmer que ça fonctionne sous *nux ?
    pour que le plein écran fonctionne sous windows, il faut initialiser le plein écran dès le départ :
    - soit en modifiant dans les paramètres par défaut du programme
    - soit transmettre une résolution plein écran dès le départ
    le changement de résolution plein écran -> plein écran fonctionne bien lui
    Fichiers attachés Fichiers attachés
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Voici mes remarques et voici une version "corrigée" :

    Ajouter Main.h
    Changer main.cpp -> Main.cpp
    Ajouter makefile

    Ajouter #ifdef USING_WINDOWS pour le include <windows.h>, était-il vraiment nécessaire ?

    Migration des include de Main.cpp dans Main.h
    Changer les include "" en <> de Main.cpp

    Migration de include "sdl/sdl.h" de Display.cpp en include <SDL/SDL.h> dans Display.h

    Enlever le define de NULL, stdlib le donne

    Passage de define à const (on est en C++...)

    Changement de l'appel Update dans le constructeur, j'avais ceci comme message :

    Display.cpp: In constructor ‘CDisplay::CDisplay(CDisplay::SParameters*)’:
    Display.cpp:19: error: no matching function for call to ‘CDisplay::Update(CDisplay::SParameters)’
    Display.h:74: note: candidates are: bool CDisplay::Update()
    Display.h:79: note: bool CDisplay::Update(CDisplay::SParameters&)
    -> Utilisation d'une variable temporaire...

    Remarque ce n'est pas encore un singleton car je peux utiliser l'opérateur d'affectation pour en faire une copie locale...


    Voili voilou,
    Jc
    Fichiers attachés Fichiers attachés

  3. #3
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    Citation Envoyé par fearyourself
    Ajouter Main.h
    Changer main.cpp -> Main.cpp
    Ok pour le Main.cpp
    désolé pour le .h, le main était juste là à titre d'exemple
    j'avoue, ça fait un peu travail baclé

    Ajouter makefile
    je ne sais pas faire de makefile
    si vous avez une solution pour me venir en aide n'hésitez pas

    Ajouter #ifdef USING_WINDOWS pour le include <windows.h>, était-il vraiment nécessaire ?
    comme je codais sous windows et avec visual, in lui fait windows.h pour comprendre les WINAPI déclarés dans gl.h
    c'est plus un #ifdef VISUAL... ou un truc du genre
    sûr que ça fait pas portable; et si je code avec code::block pas besoin

    Changer les include "" en <> de Main.cpp
    ok c'est noté

    Migration des include de Main.cpp dans Main.h
    Migration de include "sdl/sdl.h" de Display.cpp en include <SDL/SDL.h> dans Display.h
    vu qu'on inclus les .h un peu partout et étant donné que Display.h ne fait pas appel à des fonctions de la SDL, est-ce vraiment nécessaire ?
    en fait, j'ai jamais trop aimé mettre tous mes include dans le .h, ça augmente le temps de compilation inutilement
    apparemment tu me conseillerai plutot le contraire

    Enlever le define de NULL, stdlib le donne
    stdlib n'était pas inclus, bien entendu si on met tous les includes dans le .h ça résoud le problème

    Passage de define à const (on est en C++...)
    je doit oublier les define pour tout ce qui est valeur brute ?
    d'un autre côté la valeur se retrouve avec un type bien déclaré

    Changement de l'appel Update dans le constructeur, j'avais ceci comme message :
    [...]
    -> Utilisation d'une variable temporaire...
    j'ai eu du mal à comprendre mais en fait c'est parceque la fonction DefaultParameters retourne une structure que le compilo n'arrive pas à utiliser en référence
    visual ne me faisait pas d'erreur ni de warning donc je n'y avait pas prêté attention

    Remarque ce n'est pas encore un singleton car je peux utiliser l'opérateur d'affectation pour en faire une copie locale...
    autant pour moi
    en regardant la source corrigée, c'est la seule chose que tu sembles ne pas avoir modifié

    Voili voilou,
    Jc
    Merci

    ah oui, une autre chose : tu disais dans un autre post que tester un pointeur comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(m_pInstance)
    	delete m_pInstance;
     
    m_pInstance = NULL;
    était inutile et que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete m_pInstance, m_pInstance = NULL;
    était mieux, en fait delete teste le pointeur ?

    également, le basculement "fenêtré <-> plein écran" buggue sous windows contrairement à linux (merci pour le test bibi.skuk)
    si quelqu'un a une sollution à ce problème ce serait sympa
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  4. #4
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Citation Envoyé par shenron666
    ah oui, une autre chose : tu disais dans un autre post que tester un pointeur comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(m_pInstance)
    	delete m_pInstance;
     
    m_pInstance = NULL;
    était inutile et que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete m_pInstance, m_pInstance = NULL;
    était mieux, en fait delete teste le pointeur ?
    C'est simplement que delete NULL ne fais rien.
    Et si on regroupe les deux instructions sur une ligne, c'est simplement pour éviter qu'elles soient séparées. Ca montre bien que c'est une opération qui ne doit pas être éclatée.

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par shenron666
    je ne sais pas faire de makefile
    si vous avez une solution pour me venir en aide n'hésitez pas
    Je l'ai mis dans le .zip du dernier post

    vu qu'on inclus les .h un peu partout et étant donné que Display.h ne fait pas appel à des fonctions de la SDL, est-ce vraiment nécessaire ?
    en fait, j'ai jamais trop aimé mettre tous mes include dans le .h, ça augmente le temps de compilation inutilement
    Cela reste à prouver, je n'ai jamais remarqué quelque chose de tel

    apparemment tu me conseillerai plutot le contraire
    En effet, tout include dans le .h, un seul include dans toto.cpp vers toto.h -> c'est ma facon de faire... (mais au moins les <> à la place des "", ce n'est pas pareil)

    stdlib n'était pas inclus, bien entendu si on met tous les includes dans le .h ça résoud le problème
    C'est plus grave que cela, tu supposes que NULL==0 or c'est faux, certains systèmes ont une autre valeur (du moins c'est techniquement possible donc il faut rester portable...)

    je doit oublier les define pour tout ce qui est valeur brute ?
    En C++, c'est la tendance oui...

    j'ai eu du mal à comprendre mais en fait c'est parceque la fonction DefaultParameters retourne une structure que le compilo n'arrive pas à utiliser en référence
    visual ne me faisait pas d'erreur ni de warning donc je n'y avait pas prêté attention
    Je pense que le compilateur gcc n'a pas aimé parce qu'il considére que pour faire un passage par référence il faut passer une variable pas le retour d'une fonction.

    autant pour moi
    en regardant la source corrigée, c'est la seule chose que tu sembles ne pas avoir modifié
    J'ai tenté de garder le post court
    Merci

    également, le basculement "fenêtré <-> plein écran" buggue sous windows contrairement à linux (merci pour le test bibi.skuk)
    si quelqu'un a une sollution à ce problème ce serait sympa
    Faudra que je prenne le temps d'aller sous Windows -> pour mon ordi

    Jc

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par fearyourself
    Cela reste à prouver, je n'ai jamais remarqué quelque chose de tel


    En effet, tout include dans le .h, un seul include dans toto.cpp vers toto.h -> c'est ma facon de faire... (mais au moins les <> à la place des "", ce n'est pas pareil)
    Le truc est simple...

    Si par exemple, tu fait un truc du genre

    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
     
    /* ficha.h */
    #ifndef FICHA_H
    #define FICHA_H
     
    #include <stdio.h>
    #include <GL/gl.h>
     
    void foo( GLuint plop );
    #endif
    /* eof */
     
    /* ficha.c */
    #include "ficha.h"
     
    void foo( GLuint plop ) {
       printf( "%i\n", plop );
    }
    /* eof */
    Et que dans tout tes autres fichiers tu doit utiliser la fonction foo(), tu va devoir inclure à chaque fois ton fichier ficha.h, donc, pour chaque *.o que tu veux, avoir un include de stdio.h de fait, ce qui fait plein de données à traiter en plus, alors que faire :

    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
     
    /* ficha.h */
    #ifndef FICHA_H
    #define FICHA_H
     
    #include <GL/gl.h>
     
    void foo( GLuint plop );
    #endif
    /* eof */
     
    /* ficha.c */
    #include "ficha.h"
     
    #include <stdio.h>
     
    void foo( GLuint plop ) {
       printf( "%i\n", plop );
    }
    /* eof */
    Fait que tu ne fera l'include de stdio.h uniquement la ou tu en as vraiment besoin, et non partout. Par contre, cela n'est pas changeable pour le cas de GL/gl.h ici.

    En gros, on inclue dans le *.h tout ce qu'il faut pour avoir les definitions de type qui vont bien, et dans le *.[c|cpp] tout ce dont on a besoin à l'interieur des fonctions, cela peux faire gagner un peu de temps de compilation, dans le cas ou il y aurait des trucs gros (genre des templates) mais qui ne seraient pas utile dans le .h et non utilisés dans le reste du code.

    Après c'est vrai que pour un petit truc, cela ne change rien.

  7. #7
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    Citation Envoyé par fearyourself
    Citation Envoyé par shenron666
    je ne sais pas faire de makefile
    si vous avez une solution pour me venir en aide n'hésitez pas
    Je l'ai mis dans le .zip du dernier post
    En fait je parlai plus du "dis papa, comment on fait un makefile ? "
    en bref, en dehors de l'utilisation des ide je ne sais pas compiler un code source
    pour dire vrai je n'ai jamais utilisé de makefile pour compiler
    donc forcément je ne me suis jamais penché sur la question

    C'est plus grave que cela, tu supposes que NULL==0 or c'est faux, certains systèmes ont une autre valeur (du moins c'est techniquement possible donc il faut rester portable...)
    J'en prend bonne note, en faisant les include comme tu me l'a suggéré je ne devrais plus rencontrer la "fausse nécessité" de redéfinir des types standards

    Je pense que le compilateur gcc n'a pas aimé parce qu'il considére que pour faire un passage par référence il faut passer une variable pas le retour d'une fonction.
    Je pense la même chose, le compilateur 7.1 de visual (qui n'est pas le meilleur exemple, loin de là) doit compiler d'une autre façon
    il y a de quoi se poser des questions

    Faudra que je prenne le temps d'aller sous Windows -> pour mon ordi
    Je crois que le problème du bug "fullscreen<->windowed" sous windows est connu, je vais chercher un peu mais il est probable qu'il n'y ait pas de solution "propre"
    à la limite, faire un SDL_Quit suivi d'un SDL_Init en ayant pris soin auparavant de faire un SDL_WasInit pour connaitre les sous systèmes à relancer
    j'ai essayé un SDL_QuitSubSystem(SDL_INIT_VIDEO) puis un SDL_InitSubSystem(SDL_INIT_VIDEO) mais sans succès
    si je trouve quelque chose je vous les fait savoir
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  8. #8
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    Tout d'abord, concernant le passage en plein écran sous windows, ça devrai fonctionner
    Dans la FAQ sur le site de la SDL on trouve ceci :
    Q: Why doesn't SDL_WM_ToggleFullScreen() work on Windows?
    A: The semantics of SDL_WM_ToggleFullScreen() are that switching between fullscreen and windowed mode is transprent to the application. The display pixels pointer does not change, the display depth does not change, etc. This cannot be guaranteed on Windows. However, there is a simple method you can use to change between fullscreen and windowed mode:
    flags ^= SDL_FULLSCREEN;
    screen = SDL_SetVideoMode(..., flags);
    source: http://www.libsdl.org/faq.php?action...&category=4#79

    Il s'agit bien de la méthode employée, donc c'est peut-etre moi qui ait un problème ?
    Si quelqu'un peux essayer sur un système windows et me dire si le basculement fenêtre<->plein écran fonctionne ou pas ce serai sympa

    J'ai effectué quelques corrections manquantes comme la déclaration du constructeur de copie et de l'opérateur de copie dans la partie privée pour en faire un vrai singleton

    j'ai également ajouté 2 classes pour la gestion du temps
    CTimer : permet d'effectuer simplement des mesures de temps
    CTimeSps : Classe dérivée de CTimer pour faciliter le calcul d'images par secondes par exemple

    elles utilisent SDL_GetTicks pour récupérer le temps écoulé mais en remplaçant le define correspondant on peut les utiliser avec n'importe quelle bibliothèque

    j'ai estimé que ces classes étaient assez basiques et qu'un nouveau fil dans le forum n'était pas nécessaire mais si vous voulez ça peut changer

    s'il y a d'autres corrections à apporter, faites moi signe
    Shenron
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Le switch fullscreen / windowed marche bien sous linux,je n'ai pas encore pris le temps de tester sur d'autres systemes...


    Je ne suis pas chez moi, mais je testerai ton code demain, et je repasserai faire un petit commentaire

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Questions générales sur SDL / OpenGL / Qt pour la création de Jeux vidéo
    Par Invité dans le forum Développement 2D, 3D et Jeux
    Réponses: 21
    Dernier message: 23/10/2011, 10h24
  2. [Source] [SDL] Textures Textes OpenGL
    Par fearyourself dans le forum Contribuez
    Réponses: 13
    Dernier message: 09/07/2009, 08h44
  3. Demande d'aide pour une formation SDL/OpenGL.
    Par Squalthor dans le forum API graphiques
    Réponses: 14
    Dernier message: 13/07/2006, 20h24
  4. Réponses: 2
    Dernier message: 25/02/2006, 06h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo