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

OpenGL Discussion :

[Jogl] GLCanvas.init non appelé


Sujet :

OpenGL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Par défaut [Jogl] GLCanvas.init non appelé
    Bonjour à tous,

    Rapide présentation de mon appli :
    Mon appli contient un JFrame qui contient une arborescence de JSplitPane dont les feuilles sont des composants AWT ou Swing. L'un de ces composants est un GLCanvas de Jogl.

    Voici le problème :
    Je suis parfois amené à reconstruire l'arborescence de JSplitPane (parce qu'un composant est ajouté ou supprimé). Dans ce cas, je redirige mon GLCanvas vers un autre JSplitPane. Il semble que ce genre de manip aboutit à une destruction / reconstruction du contexte OpenGL associé au GLCanvas, ce qui est conforme à ce qu'annonce la doc Jogl. Dans ce cas, la méthode GLCanvas.init() est censée être appelée. Seulement voilà, dans mon cas elle est parfois appelée, parfois pas, avec toutes les conséquences que cela a... Evidemment, je ne parviens à trouver un moyen de reproduire à 100% le problème.
    Pour info, ce comportement aléatoire se produit sous windows et pas sous linux. J'ai reproduit identiquement le bug avec les versions 1.1.0 et 1.0.0 de Jogl.

    Je remercie d'avance toute bonne volonté qui voudrait m'éclairer sur ces caprices de la méthode init() !

  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 : 44
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    C'est forcément pas un problème de la fonction init vu que c'est plutôt la faute de la fonction qui devrait appeler cette fonction.

    A savoir, que tu fais sûrement une fausse manip ou tu pourrais par exemple l'appeler toi-même non ?

    Avec une programmation un peu particulière, tu pourrais sûrement mettre en place un système qui teste si le système a reinitialiser le contexte et sinon le fait toi-même.

    Je ne suis pas sûr si cela résolvera le problème mais il me semble que :

    - Tu peux soit chercher sous Windows :
    1) S'il détruit le contexte openGL et l'objet GLCanvas à chaque fois
    2) S'il reconstruit l'objet GLCanvas à chaque fois mais n'appelle pas la fonction init

    Jc

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Par défaut
    Tester si le contexte a été réinitialisé, c'est aussi ce que j'ai cherché à faire.

    J'ai avancé depuis hier et j'ai identifié les différentes étapes qui mènent au bug :
    1/ La hiérarchie des composants du frame est recréée : le contexte OpenGL est zigouillé.
    2/ Si la souris se trouvait au dessus du GLCanvas à ce moment là et qu'on est sous Windows un appel au mouseMoved() du listener que j'ai branché sur le canvas est effectué avant que le repaint du Canvas soit effectué. Sous linux, c'est l'inverse.
    3/ Dans ce callback mouseMoved(), je rends mon contexte courant pour rafraîchir la scène en mode sélection. Sous windows, ce makeCurrent renvoie GL_CONTEXT_CURRENT_NEW mais je ne testais pas la valeur de retour et n'initialisais pas en conséquence.
    4/ Lorsque l'appel à display() est enfin effectué, le makeCurrent qui est réalisé automatiquement par le code de Jogl renvoie GL_CONTEXT_CURRENT et ce même code n'appelle donc pas init().

    Après réflexion, il me semble qu'il me suffit de tester la valeur de retour du makeCurrent dans mon mouseMoved() pour appeler init() si elle vaut GL_CONTEXT_CURRENT_NEW. J'ai testé cette correction et cela marche. Mais il y a tout de même une chose que je ne comprends pas : pourquoi cet appel à init() n'est pas effectué automatiquement par Jogl lors d'une requête à makeCurrent() plutôt que de le faire seulement lors d'un appel à display() ? En fait, plutôt que d'avertir l'utilisateur par une valeur de retour de GLContext.makeCurrent(), il faudrait effectuer un appel automatique à init() du GLEventListener si nécessaire.

    Pour conclure, je pense avoir corrigé mon bug mais il me semble qu'il demeure un grave problème d'encapsulation dans l'architecture de Jogl . Je n'utilise Jogl que depuis quelques semaines et j'espère ne pas avoir misé sur le mauvais cheval en choisissant cette API !

    Merci pour ton aide fearyourself.

Discussions similaires

  1. Filtre non appelé avec jsp:include
    Par atuan dans le forum Taglibs
    Réponses: 1
    Dernier message: 08/11/2006, 11h27
  2. classe Action non appelée
    Par jc44 dans le forum Struts 1
    Réponses: 4
    Dernier message: 18/08/2006, 14h22
  3. onkeyup non appellé
    Par GregPeck dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/02/2006, 17h22
  4. Verifier formulaire - fonction non appelée
    Par nerick dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/12/2005, 17h44
  5. Réponses: 3
    Dernier message: 23/08/2005, 11h02

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