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] Appeler l'affichage OpenGL à partir d'une classe quelquonque.


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut [JOGL] Appeler l'affichage OpenGL à partir d'une classe quelquonque.
    Salut!

    Comment faire pour, à partir d'une classe qui gère des graphes par exemple, afficher les graphiques en utilisant une classe dédiée à l'affichage.
    Exemple:
    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
    class Graphiques{
     
    ClasseAffichageOpenGL objetOpenGL;
    ...
    void afficheLigne(int x1,int y1,int x2,int y2){
    objetOpenGL.dessinerLigne(x1,y1,x2,y2);
    }
    ...
    }
     
    class ClasseAffichageOpenGL implements GLEventListener,KeyListener,MouseListener,MouseMotionListener{
    ...
    void dessinerLigne(int x1,int y1,int x2,int y2){
    gl.glBegin(GL.GL_LINE);
    gl.glVertex2d(x1,y1);
    gl.glVertex2d(x2,y2);
    gl.glEnd();
    }
    ...
    }
    1)Comment faire pour faire sortir la partie affichage de la méthode "display" classique?
    Faut il toujours un objet "GLDrawable" en paramètre?
    2)D'ou vient l'objet "GLDrawable":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void display(GLDrawable glDrawable)
    Comment et par qui est il créé et comment est il transmit à toutes les méthodes sans jamais apparaître dans le code?
    3)Peut on appeler les fonctions d'affichage de cette classe à partir d'une autre sans devoir passer en paramètre un "GLDrawable"?

    Merci de votre aide.

  2. #2
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 819
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 819
    Par défaut
    Citation Envoyé par seriousme
    1)Comment faire pour faire sortir la partie affichage de la méthode "display" classique?
    Faut il toujours un objet "GLDrawable" en paramètre?
    ça dépend... soit tu passes ton GLDrawable en paramètre, soit tu passes ton objet GL correspondant... je crois me souvenir qu'il est préférable de passer le GLDrawable et récupérer le GL, mais je ne saurais plus dire pourquoi.


    Citation Envoyé par seriousme
    2)D'ou vient l'objet "GLDrawable":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void display(GLDrawable glDrawable)
    Comment et par qui est il créé et comment est il transmit à toutes les méthodes sans jamais apparaître dans le code?
    GLDrawable est une interface qu'implémente GLCanvas par exemple. C'est donc lié à ton composant graphique.


    Citation Envoyé par seriousme
    3)Peut on appeler les fonctions d'affichage de cette classe à partir d'une autre sans devoir passer en paramètre un "GLDrawable"?
    Ca dépend de ce que font les fonctions... à mon avis, il serait préférable de le passer en paramètre. Sinon tu risques de vouloir afficher sur le mauvais pipeline...

    Mais bon, je ne comprends pas trop ce que tu veux faire donc...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 115
    Par défaut
    c'est en effet une bonne question

    mais JOGl fonctionne, dans ses dernières versions, avec un système de callback qui appelle sans cesse ta méthode display

    Je pense pas que ce soit possible d'externaliser l'affichage hors de ta méthode display : c'est à dire faire des gl.glBegin();, gl.glEnd(); etc.... hors des 4 méthodes de callback


    mais bon je ne comprend pas spécialement bien non plus donc je sais pas t'en dire plus


    A+
    omlip

  4. #4
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    soit tu passes ton GLDrawable en paramètre, soit tu passes ton objet GL correspondant
    De quelle manière?
    Car justement comment récupérer ce "GLDrawable" qui n'apparaît nulle part, a part justement dans les fonctions classiques d'affichage comme "display".
    Comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public void display(GLDrawable glDrawable){
    fonctionQuiFaitLeGraphe(glDrawable,...);
    ?
    Mais il faut toujours passer par cette fonction "display".
    Je pense pas que ce soit possible d'externaliser l'affichage hors de ta méthode display
    Si c'est effectivement le cas JOGL manque vraiment de souplesse.
    Mais bon, je ne comprends pas trop ce que tu veux faire donc...
    En fait une classe est chargée de définir les caractéristiques d'un graphique:
    fonction à représenter, paramètre d'affichage...
    Dans cette classe tous les points du graphique sont calculés, stockés dans un "ArrayList" puis il faudrait pouvoir les envoyer à une fonction qui afficherait tous ces points, du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void display(GLDrawable glDrawable,ArrayList<Double> PointList){
    /*Afficher les points*/
    }

  5. #5
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 819
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 819
    Par défaut
    Citation Envoyé par seriousme
    De quelle manière?
    Car justement comment récupérer ce "GLDrawable" qui n'apparaît nulle part, a part justement dans les fonctions classiques d'affichage comme "display".
    Comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public void display(GLDrawable glDrawable){
    fonctionQuiFaitLeGraphe(glDrawable,...);
    ?
    Et oui, par exemple. Si ta fonctionQuiFaitLeGraphe doit afficher quelque chose quelque part, il faut bien qu'elle sache où se situe le "quelque part". Donc soit lui fournir le GLDrawable en paramètre, soit le stocker en tant qu'instance de classe accessible par toutes les méthodes de la classe. Mais dans tous les cas, il faut que la fonction qui dessine ait accès à l'objet où elle doit dessiner.


    Citation Envoyé par seriousme
    Mais il faut toujours passer par cette fonction "display".
    Elle est appelée à chaque fois qu'il y a besoin de redessiner l'affichage. C'est un point de passage quasi-obligé (je mets le "quasi", car j'en vois bien un ou deux qui vont dire que ce n'est pas forcé...)

    Citation Envoyé par seriousme
    Si c'est effectivement le cas JOGL manque vraiment de souplesse.
    Pourquoi?
    Tu as le même soucis en OpenGL. Il te faut une procédure qui aura en charge de gérer l'affichage.
    Pou JOGL, il s'agit de display()...

    Citation Envoyé par seriousme
    En fait une classe est chargée de définir les caractéristiques d'un graphique:
    fonction à représenter, paramètre d'affichage...
    Dans cette classe tous les points du graphique sont calculés, stockés dans un "ArrayList" puis il faudrait pouvoir les envoyer à une fonction qui afficherait tous ces points, du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void display(GLDrawable glDrawable,ArrayList<Double> PointList){
    /*Afficher les points*/
    }
    Perso, je ne vois toujours pas où est ton problème.... Qu'est-ce qui te bloque dans la démarche que tu expliques là?
    Tu mets ton arraylist en instance de classe (vu que c'est lié à ton objet graphique), tu le remplis dans une méthode (méthode1), et tu l'affiches avec une autre méthode (méthode2). Il suffit ensuite d'appeler la méthode2 depuis la méthode display() (en passant le GLDrawable de display() en paramètre à la méthode2), et terminé, c'est affiché. Non?
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  6. #6
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Concètement:
    dans la classe qui gère le graphique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    OpenGLInterface gLInterface;
    ...
    private void drawAxes(){
    		ArrayList<Double> xAxe=new ArrayList<Double>(6);
    		xAxe.add(-1.);
    		xAxe.add(0.);
    		xAxe.add(0.);
    		xAxe.add(1.);
    		xAxe.add(0.);
    		xAxe.add(0.);
    		GLInterface.display1(/*le GLDrawable*/,xAxe);
    	}
    Et dans la classe OpenGLInterface:
    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
    public void display(GLDrawable glDrawable,ArrayList<Double> PointList){
     
    		GL gl=glDrawable.getGL();
    		GLU glu=glDrawable.getGLU();
    		gl.glClearColor(0.f,0.f,0.f,1f);
    		gl.glClear(GL.GL_COLOR_BUFFER_BIT);
    		glu.gluPerspective(45,1,1,100);
    		glu.gluLookAt(0,0,10,0,0,0,0,1,0);
     
    		for(int n=0;n<PointList.size();n+=6){
    			gl.glBegin(GL.GL_LINE);
    			gl.glVertex3d(Double.valueOf(PointList.get(n)),Double.valueOf(PointList.get(n+1)),Double.valueOf(PointList.get(n+2)));
    			gl.glVertex3d(Double.valueOf(PointList.get(n+3)),Double.valueOf(PointList.get(n+4)),Double.valueOf(PointList.get(n+5)));
    			gl.glEnd();
    		}
    	}
    surchargée pour pouvoir lui passer le tableau de points.
    Mais comment créer un "GLDrawable" valide pour le passer en paramètre?

    Et la classe qui gère le graphique est quelquonque.

    Sinon ce que tu dis est vrai si la classe est du type "OpenGLInterface" et là il n'y a pas de problème mais l'externalisation de l'affichage n'est pas suffisante; il faudrait appeler "display" depuis l'autre classe.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/12/2006, 18h15
  2. affichage simultané à partir d'une selection combo
    Par donyas dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 27/07/2006, 14h59
  3. [ASP][D8] Appel WebForm2.aspx a partir d'une WenForm1.aspx
    Par pop bob dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 12/09/2005, 15h06
  4. [SERVLET]Appel d'un fichier à partir d'une servlet
    Par fchafia dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 17/03/2005, 12h21

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