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

GTK+ avec C & C++ Discussion :

GTK et OpenGL


Sujet :

GTK+ avec C & C++

  1. #1
    Membre chevronn� Avatar de straasha
    Homme Profil pro
    D�veloppeur en syst�mes embarqu�s
    Inscrit en
    Juillet 2004
    Messages
    149
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur en syst�mes embarqu�s
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par d�faut GTK et OpenGL
    Bonjour,

    Je voudrai faire une application fen�tre avec barre d'outils et autre contenant notamment une ou plusieurs zone pour dessiner des sc�nes OpenGL.
    J'ai install� le pack bundle depuis http://www.gtk.org/download/win32.php.
    J'ai cr�� un projet sous Code::Block dont le code par d�faut m'a permis d'afficher une fenetre avec 2 boutons (1 pour quitter et 1 pour afficher une fen�tre de dialogue "Hello World").
    Le pack GTK est donc bien install�.
    Par contre lorsque je reprend l'exemple trouv� sur http://forum.ubuntu-fr.org/viewtopic.php?id=725661 (le 2e qui est en C vu que le 1er est en python) j'ai le message d'erreur suivant :
    erreur fatale : gdk/gdkgl.h : No such file or directory
    et effectivement dans mon r�pertoire GTK il n'y a aucun fichier de ce nom.

    du coup je me demande d'o� il sort ? est ce que ca vient d'une vielle version de GTK ? et dans ce cas l� comment fait-on aujourd'hui ? ou est-ce un truc sp�cifique � Ubuntu (le code vient du forum Ubuntu-fr mais je d�veloppe sous winXP) ?

    merci d'�clairer ma lanterne moi qui d�couvre GTK.

  2. #2
    Membre �clair�
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de pr�cision�
    Inscrit en
    Avril 2008
    Messages
    190
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : En cours de pr�cision�

    Informations forums :
    Inscription : Avril 2008
    Messages : 190
    Par d�faut
    Salut � tous !

    Tiens, �a fait longtemps que je ne suis pas pass� sur le forum Ubuntu-fr.

    Contrairement � ce qu�y dit Hibou57, il existe bien une version C++ de GtkGlExt, � savoir GtkGlExtmm. Justement, je suis en train de r�aliser la conversion des tutoriels NeHe en Gtkmm et je compte les mettre tr�s prochainement � disposition de n�importe qui pour aider � utiliser GtkGlExtmm. Et faire quelques articles pour aider.

    Joins � ce message, le septi�me tutoriel NeHe, version Gtkmm. Il est g�r� avec CMake, il n�y a normalement rien de particulier � faire pour le compiler sous Windows. Je t�invite � le t�l�charger et � me confirmer que tu as pu ouvrir l�archive et compiler le code. Cela te fera un exemple.

    Je ne sais pas trop o� Hibou57 a trouv� � #include <gdk/gdkgl.h> � et � #include <gtk/gtkgl.h> �. En C, il faut � #include <gtkgl.h> �, en C++ � #include <gtkglmm.h> �. Sauf erreur de ma part, l�installateur officiel de Gtk+ sos Microsoft Windows permet l�installation de GtkGlExtmm.

    Est-ce que cela t�aide ?

    � bient�t.

    Le Farfadet Spatial

    �dition : une fois le programme lanc�, si tu appuies sur la touche � F �, tu appliqueras des filtres successifs sur les textures, si tu appuies sur � L � tu allumes ou �teints la l��clairage. Tu peux faire bouger le cube en utilisant les fl�ches, ainsi que � Pg.Pr�c � et � Pg.Suiv �.
    Fichiers attach�s Fichiers attach�s

  3. #3
    Membre chevronn� Avatar de straasha
    Homme Profil pro
    D�veloppeur en syst�mes embarqu�s
    Inscrit en
    Juillet 2004
    Messages
    149
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur en syst�mes embarqu�s
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par d�faut
    merci pour ta r�ponse, je vais regarder �a maintenant et je reviendrai dire ce qu'il en est

  4. #4
    Membre chevronn� Avatar de straasha
    Homme Profil pro
    D�veloppeur en syst�mes embarqu�s
    Inscrit en
    Juillet 2004
    Messages
    149
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur en syst�mes embarqu�s
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par d�faut
    bon apr�s une interruption r�union et la d�couverte de CMake (avant je pensais que c'�tait un compilateur comme gcc ou autre ), il apparait que :
    sh.exe was found in your PATH, here:
    C:/WINDOWS/system32/bin/sh.exe

    For MinGW make to work correctly sh.exe must NOT be in your path.
    et comme je n'ai pas les droits admin sur ma machine, je peux pas virer c:/WINDOWS/system32/bin du PATH m�me temporairement
    du coup il faut que je trouve une autre solution sans passer par CMake

  5. #5
    Membre �clair�
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de pr�cision�
    Inscrit en
    Avril 2008
    Messages
    190
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : En cours de pr�cision�

    Informations forums :
    Inscription : Avril 2008
    Messages : 190
    Par d�faut
    Salut � tous !

    Visiblement, tu utilises MinGW. C�est parfaitement support� par Gtk+, voir l�environnement support� par d�faut par Gtk+ sur Windows.

    Gtk+ a plut�t tendance � utiliser Autotools que CMake, je pr�f�re CMake car plus portable, mais tu pourras parfaitement utiliser Gtk+ sans y avoir recours.

    Pour l�instant, oubli le code que je t�ai donn�. Nous allons proc�der par �tapes peut-�tre un peu plus longues, mais il n�y a pas de raison de ne pas s�en sortir. Premi�rement, avec l�installateur de Gtk+, v�rifie que tu as bien install� GtkGlExt.

    Par ailleurs, pour l�instant GtkGlExt n�a pas �t� port� sur Gtk+ 3 et il n�y a pas encore de distribution officielle de Gtk+ 3 pour Microsoft Windows, donc je voudrais m�assurer que tu as bien install� Gtk+ 2.

    GtkGlExt permet de donner des capacit�s OpenGL a n�importe quel composant, mais le plus courant est de le faire dans une zone de dessin. Donc, je t�invite � prendre le premier exemple Cairo du tutoriel Gtkmm et � le compiler. Le tutoriel donne �galement les bases pour pouvoir compiler un projet Gtkmm avec les Autotools, au besoin tu peux utiliser cet autre tutoriel sur le sujet. Une fois cela fait, revient ici et nous verrons comment ajouter les capacit�s OpenGL au composant.

    Au fait, je t�ai donn� le tutoriel version C++, mais peut-�tre es-tu plus int�ress� par le C ?

    � bient�t.

    Le Farfadet Spatial

  6. #6
    Membre chevronn� Avatar de straasha
    Homme Profil pro
    D�veloppeur en syst�mes embarqu�s
    Inscrit en
    Juillet 2004
    Messages
    149
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur en syst�mes embarqu�s
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par d�faut
    bon alors j'ai r�ussi � param�trer code::block pour le 1er exemple Cairo
    j'ai donc la fen�tre avec les 3 droites, ce qui est pas mal vu d�o� je pars.
    maintenant il reste plus qu'a lier �a avec OpenGL.

    Pour ce qui est du C ou C++, je suis d�veloppeur embarqu� ce qui fait que je suis plus � l'aise avec le C mais je connais aussi le C++ et �a pourrait etre aussi un bon exercice pour moi de m'y remettre, tout comme l'OpenGL, �a fait presque 10 ans que j'en ai pas fait par contre j'avais jamais utilis� GTK.

  7. #7
    Membre �clair�
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de pr�cision�
    Inscrit en
    Avril 2008
    Messages
    190
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : En cours de pr�cision�

    Informations forums :
    Inscription : Avril 2008
    Messages : 190
    Par d�faut
    Salut � tous !

    Bon, donc, tu avances. Poste ici le code que tu as produit, j�essayerais de te proposer des modifications pour faire un trac� OpenGL.

    � bient�t.

    Le Farfadet Spatial

  8. #8
    Membre chevronn� Avatar de straasha
    Homme Profil pro
    D�veloppeur en syst�mes embarqu�s
    Inscrit en
    Juillet 2004
    Messages
    149
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur en syst�mes embarqu�s
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par d�faut
    ce que j'ai c'est le tutorial Cairo :
    Code myarea.h : 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
    #ifndef GTKMM_EXAMPLE_MYAREA_H
    #define GTKMM_EXAMPLE_MYAREA_H
     
    #include <gtkmm/drawingarea.h>
     
    class MyArea : public Gtk::DrawingArea
    {
    public:
      MyArea();
      virtual ~MyArea();
     
    protected:
      //Override default signal handler:
      virtual bool on_expose_event(GdkEventExpose* event);
    };
     
    #endif // GTKMM_EXAMPLE_MYAREA_H
    Code myarea.cc : 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #include "myarea.h"
    #include <cairomm/context.h>
     
    MyArea::MyArea()
    {
    }
     
    MyArea::~MyArea()
    {
    }
     
    bool MyArea::on_expose_event(GdkEventExpose* event)
    {
      // This is where we draw on the window
      Glib::RefPtr<Gdk::Window> window = get_window();
      if(window)
      {
        Gtk::Allocation allocation = get_allocation();
        const int width = allocation.get_width();
        const int height = allocation.get_height();
     
        // coordinates for the center of the window
        int xc, yc;
        xc = width / 2;
        yc = height / 2;
     
        Cairo::RefPtr<Cairo::Context> cr = window->create_cairo_context();
        cr->set_line_width(10.0);
     
        // clip to the area indicated by the expose event so that we only redraw
        // the portion of the window that needs to be redrawn
        cr->rectangle(event->area.x, event->area.y,
                event->area.width, event->area.height);
        cr->clip();
     
        // draw red lines out from the center of the window
        cr->set_source_rgb(0.8, 0.0, 0.0);
        cr->move_to(0, 0);
        cr->line_to(xc, yc);
        cr->line_to(0, height);
        cr->move_to(xc, yc);
        cr->line_to(width, yc);
        cr->stroke();
      }
     
      return true;
    }
    Code main.cc : 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
    #include "myarea.h"
    #include <gtkmm/main.h>
    #include <gtkmm/window.h>
     
    int main(int argc, char** argv)
    {
       Gtk::Main kit(argc, argv);
     
       Gtk::Window win;
       win.set_title("DrawingArea");
     
       MyArea area;
       win.add(area);
       area.show();
     
       Gtk::Main::run(win);
     
       return 0;
    }

  9. #9
    Membre �clair�
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de pr�cision�
    Inscrit en
    Avril 2008
    Messages
    190
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : En cours de pr�cision�

    Informations forums :
    Inscription : Avril 2008
    Messages : 190
    Par d�faut
    Salut � tous !

    Reprendre le tutoriel est une bonne approche. Tu as utilis� le tutoriel C++, que je trouve plus accessible que ce que l�on trouve en C. Voici les modifications que je te propose pour obtenir un zone de rendu OpenGL. J�ai essay� de suivre les conventions que tu as appliqu�es dans ton code. J�ai mis les commentaires et les messages en fran�ais, j�ai pens� que tu pr�f�rerais.

    Dans tes fichiers de gestion du projet � que ce soit Make, Autotools, CMake, Scons ou autre �, il faut ajouter � gtkglextmm �. Pkg-config g�re de mani�re standard GtkGlExt, donc il suffit d�ajouter quelque chose d�approchant ceci :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    pkg-config gtkglextmm-1.2 --cflags --libs
    � adapter pour coller au gestionnaire de projets utilis�.

    Malheureusement, pour l�instant GtkGlExt n�est pas totalement compatible avec OpenGL 3, ni OpenGL 4, il faut s�en tenir � un OpenGL plus archa�que.

    J�ai ajout� des classes pour la gestion d�exceptions. Il n�est pas obligatoire de g�rer les erreurs par exceptions, mais je trouve cela plus propre. Du coup, j�ai ajout� le fichier � erreurs.h � suivant :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    #ifndef ERREURS_H
    #define ERREURS_H
     
    /*
     * Exceptions pour la gestions des erreurs.
     */
     
    #include <exception>
     
    /* Espace de nommage pour la gestion des erreurs. */
    namespace Erreurs {
      /* Erreurs provoquées par l’interface graphique. */
      class ErreurInterface: public std::exception {
        public:
          /* Constructeur par défaut. */
          ErreurInterface () throw () {}
     
          /* Destructeur. */
          virtual ~ErreurInterface () throw () {}
     
          /* Génére le message d’erreur. */
          virtual const char* what () const throw () {
            return "une erreur s’est produite dans l’interface graphique";
          }
      };
     
      /* Erreur lors de la configuration d’OpenGL. */
      class ErreurConfigurationGL: public ErreurInterface {
        public:
          /* Constructeur par défaut. */
          ErreurConfigurationGL () throw () {}
     
          /* Destructeur. */
          virtual ~ErreurConfigurationGL () throw () {}
     
          /* Génère le message d’erreur. */
          virtual const char* what () const throw () {
            return "erreur lors de la configuration d’OpenGL";
          }
      };
     
      /* Erreur lors de la création du contexte OpenGL. */
      class ErreurCreationContexte: public ErreurInterface {
        public:
          /* Constructeur par défaut. */
          ErreurCreationContexte () throw () {}
     
          /* Destructeur. */
          virtual ~ErreurCreationContexte () throw () {}
     
          /* Génère le message d’erreur. */
          virtual const char* what () const throw () {
            return "impossible de créer un contexte OpenGL";
          }
      };
     
      /* Erreur à l’obtention du contexte OpenGL. */
      class ErreurObtentionContexte: public ErreurInterface {
        public:
          /* Constructeur par défaut. */
          ErreurObtentionContexte () throw () {}
     
          /* Destructeur. */
          virtual ~ErreurObtentionContexte () throw () {}
     
          /* Génère le message d’erreur. */
          virtual const char* what () const throw () {
            return "impossible d’obtenir le contexte OpenGL";
          }
      };
    }
     
    #endif  /* #ifndef ERREURS_H */
    On remarque que j�ai �galement ajout� un espace de nommage pour les erreurs. Je conseille fortement l�usage d�espaces de nommages, cela permet de r�gler beaucoup de probl�mes.

    Premi�re chose pour utiliser GtkGlExtmm, il faut ajouter les en-t�tes. � #include <gtkglmm.h> � inclus tous les en-t�tes de l�extension, c�est-�-dire ce qui permet d�initialiser le contexte et les primitives d�OpenGL, soit ce que l�on utilise � chaque fois. Inutile, en cons�quence, de cherche � inclure plus finement les en-t�tes, la seule chose que l�on ferait c�est reprendre exactement ce qui est fait dans l�en-t�te � gtkglmm.h �.

    Il faut donc ajouter les capacit�s OpenGL au composant. Cela cr�era un contexte OpenGL dans le composant. Ce contexte est un contexte OpenGL classique, il faut donc le lier au contexte Gtk+. En cons�quence, il faut n�cessairement surcharger les m�thodes � on_realize � (qui correspond � l�initialisation de la fen�tre) et � on_configure_event � � correspondant � l��v�nement de changement de la configuration, notamment lorsque la fen�tre est redimensionn�e.

    Ce qui implique de modifier le fichier � myarea.h � de la fa�on suivante :

    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
    21
    22
    23
    #ifndef GTKMM_EXAMPLE_MYAREA_H
    #define GTKMM_EXAMPLE_MYAREA_H
     
    #include <gtkmm/drawingarea.h>
    #include <gtkglmm.h>
     
    class MyArea : public Gtk::DrawingArea, public Gtk::GL::Widget<MyArea> {
      public:
        MyArea ();
        virtual ~MyArea ();
     
      protected:
        //Override default signal handler:
        virtual bool on_expose_event (GdkEventExpose* event);
     
        /* À l’initialisation de la fenêtre. */
        virtual void on_realize ();
     
        /* Au changement de taille de la fenêtre. */
        virtual bool on_configure_event (GdkEventConfigure* event);
    };
     
    #endif // GTKMM_EXAMPLE_MYAREA_H
    Il faut faire attention � ce que l�initialisation d�OpenGL et la cr�ation du contexte soit fait avant tout rendu, sinon cela provoquera une erreur. Pour cela, il faut faire attention � ce qui est appel� en fonction de quel �v�nement.

    Tout d�abord, je conseille de faire l�initialisation d�OpenGL dans le constructeur de la classe du composant. Je fais la cr�ation du contexte OpenGL (qui se base sur l�initialisation pr�c�dente) dans la m�thode � on_realize �. OpenGL �tant une machine � �tat avec conservation du contexte, il n�est pas n�cessaire, contrairement � ce qui se passe avec Cairo, de cr�er un contexte � chaque rendu, on peut utiliser le m�me � chaque fois.

    Le rendu se fait toujours dans la m�thode � on_expose_event �. Entre � gl_begin(get_gl_context()) � et � gl_end() �, nous sommes dans un contexte OpenGL classique, il suffit de faire des appels aux fonctions OpenGL comme on le ferait dans n�importe quel cas.

    Enfin, on prend en compte le redimensionnement dans � on_configure_event �. Attention : si Gtk+ r�alise bien le changement de taille, il n�en notifie pas OpenGL. Il faut donc le faire soit-m�me en appelant � glViewport �.

    Ce qui donne les modifications suivantes dans le fichier � myarea.cc � :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    #include <cairomm/context.h>
    #include <glibmm/error.h>
    #include <sstream>
    #include <GL/glu.h>
     
    #include "myarea.h"
    #include "erreurs.h"
     
    MyArea::MyArea () {
      #ifndef GLIBMM_DEFAULT_SIGNAL_HANDLERS_ENABLED
        /* Connecte les contrôleurs de signaux s’il ne s’agit pas déjà de
           méthodes virtuelles surchargées : */
        signal_realize().connect(sigc::mem_fun(*this,
                                               &GlDrawingArea::on_realize),
                                 false);
        signal_expose_event().connect(sigc::mem_fun(*this,
                                                &GlDrawingArea::on_expose_event),
                                      false);
        signal_configure_event().connect(sigc::mem_fun(*this,
                                             &GlDrawingArea::on_configure_event),
                                         false);
      #endif  /* #ifndef GLIBMM_DEFAULT_SIGNAL_HANDLERS_ENABLED */
     
      /* Configuration d’OpenGL */
      Glib::RefPtr<Gdk::GL::Config> configuration;
     
      /* Tente d’ouvrir une espace à double tampon. */
      configuration = Gdk::GL::Config::create(Gdk::GL::MODE_RGBA   |
                                              Gdk::GL::MODE_DEPTH  |
                                              Gdk::GL::MODE_DOUBLE);
      if (!configuration) {
        /* Message d’avertissement. */
        std::stringstream message;
        message << "Impossible de configurer OpenGL en mode double tampon, "
                << "tente le mode simple tampon.\n";
        g_warning(message.str().c_str());
        /* Tente de configurer un tampon simple. */
        configuration = Gdk::GL::Config::create(Gdk::GL::MODE_RGBA  |
                                                Gdk::GL::MODE_DEPTH);
        if (!configuration) throw Erreurs::ErreurConfigurationGL ();
      }
     
      /* Donne accès à OpenGL au composant. */
      set_gl_capability(configuration);
    }
     
    MyArea::~MyArea () {
    }
     
    /* Initialisation du contexte OpenGL. */
    void MyArea::on_realize () {
      /* D’abord l’initialisation standard. */
      Gtk::Widget::on_realize();
     
      if (!create_gl_context()) throw Erreurs::ErreurCreationContexte ();
      /* Fenêtre OpenGL. */
      Glib::RefPtr<Gdk::GL::Window> fenetreGl = get_gl_window();
      if (!fenetreGl) throw Erreurs::ErreurObtentionContexte ();
     
      fenetreGl->gl_begin(get_gl_context());
     
        /* Permet un joli ombrage. */
        glShadeModel(GL_SMOOTH);
     
        /* Fond noir. */
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
     
        /* Mis en place du tampon de profondeur. */
        glClearDepth(1.0f);
        /* Mis en place du test de profondeur. */
        glEnable(GL_DEPTH_TEST);
        /* Le type de test de profondeur . */
        glDepthFunc(GL_LEQUAL);
     
        /* Calcul de perspective le plus réaliste. */
        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
     
      fenetreGl->gl_end();
    }
     
    bool MyArea::on_expose_event (GdkEventExpose* event) {
        /* Fenêtre OpenGL. */
      Glib::RefPtr<Gdk::GL::Window> fenetreGl = get_gl_window();
      if (!fenetreGl)  throw Erreurs::ErreurObtentionContexte ();
     
      fenetreGl->gl_begin(get_gl_context());
     
        /* Vide l'écran et le Z-Buffer (Depth Buffer : contient les informations
           de profondeur de chaque pixel). */
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        /* Repositionne la caméra. */
        glLoadIdentity();
     
        /* Bouge de 1.5 unités vers la gauche et de 6.0 unités vers l'intérieur
           de l'écran. */
        glTranslatef(-1.5f,0.0f,-6.0f);
     
        /* Dessiner un Triangle. */
        glBegin(GL_TRIANGLES);
          /* Point du haut. */
          glVertex3f( 0.0f, 1.0f, 0.0f);
          /* Point en bas à gauche. */
          glVertex3f(-1.0f,-1.0f, 0.0f);
          /* Point en bas à droite */
          glVertex3f( 1.0f,-1.0f, 0.0f);
        /* Le dessin du Triangle est fini */
        glEnd();
     
        /* Bouge de 3.0f unités vers la droite. */
        glTranslatef(3.0f,0.0f,0.0f);
     
        /* Dessin d'un quadrilatère. */
        glBegin(GL_QUADS);
          /* Haut Gauche. */
          glVertex3f(-1.0f, 1.0f, 0.0f);
          /* Haut Droite. */
          glVertex3f( 1.0f, 1.0f, 0.0f);
          /* Bas Droite. */
          glVertex3f( 1.0f,-1.0f, 0.0f);
          /* Bas Gauche. */
          glVertex3f(-1.0f,-1.0f, 0.0f);
        glEnd();
     
      fenetreGl->gl_end();
      fenetreGl->swap_buffers();
     
      /* Partie standard de la la procédure d’affichage. */
      return Gtk::Widget::on_expose_event(event);
    }
     
    /* Lorsque la fenêtre est redimensionnée. */
    bool MyArea::on_configure_event (GdkEventConfigure* event) {
      /* Fenêtre OpenGL. */
      Glib::RefPtr<Gdk::GL::Window> fenetreGl = get_gl_window();
      if (!fenetreGl)  throw Erreurs::ErreurObtentionContexte ();
     
      /* Largeur de la zone de rendu. */
      const GLsizei largeur = static_cast<GLsizei>(get_width());
      /* Hauteur de la zone de rendu. */
      const GLsizei hauteur = static_cast<GLsizei>(get_height());
     
      fenetreGl->gl_begin(get_gl_context());
     
        /* Fixer la taille de la zone de rendue. */
        glViewport(0, 0, largeur, hauteur);
        /* Choisir la matrice de projection. */
        glMatrixMode(GL_PROJECTION);
        /* Remettre a zéro de la matrice de projection. */
        glLoadIdentity();
     
        /* Calculer le ratio pour la perspective de la fenêtre. */
        gluPerspective(45.0f, static_cast<GLfloat>(largeur)
                                / static_cast<GLfloat>(hauteur), 0.1f,100.0f);
        glMatrixMode(GL_MODELVIEW);
        /* Remetre à zéro la matrice de modélisation. */
        glLoadIdentity();
     
      fenetreGl->gl_end();
     
      /* Partie standard du redimensionnement. */
      return Gtk::Widget::on_configure_event(event);
    }
    Comme exemple, j�ai pris le trac� d�un triangle et d�un carr�, blancs tous les deux.

    Enfin, il faut penser � faire l�initialisation g�n�rale d�OpenGL avant de faire le moindre appel � OpenGL. Cela ce fait avec � Gtk::GL::init �. Comme cette fonction prend les arguments de la ligne de commande, je fais cet appel dans la fonction principale. J�y ai aussi ajout� la gestion des exceptions. Ce qui donne les modifications suivantes du fichier � main.cc � :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #include <gtkmm/main.h>
    #include <gtkmm/window.h>
    #include <gtkglmm.h>
    #include <exception>
    #include <glibmm/error.h>
    #include <sstream>
    #include <iostream>
     
    #include "myarea.h"
    #include "erreurs.h"
     
    int main(int argc, char** argv) {
      try {
        Gtk::Main kit(argc, argv);
        Gtk::GL::init(argc, argv);
     
        Gtk::Window win;
        win.set_title("DrawingArea");
     
        MyArea area;
        win.add(area);
        area.show();
     
        Gtk::Main::run(win);
     
        return 0;
      }
      catch(const Glib::Error &ex) {
        /* Message d’erreur. */
        std::ostringstream message;
        message << "Erreur venant de GLib : " <<  ex.what() << '\n';
        g_critical(message.str().c_str());
        return -1;
      }
      catch (const Erreurs::ErreurInterface &e) {
        /* Message d’erreur. */
        std::ostringstream message;
        message << "Erreur de contexte OpenGL : " << e.what() << ".\n";
        g_critical(message.str().c_str());
        return -2;
      }
      catch (const std::exception &e) {
        /* Message d’erreur. */
        std::ostringstream message;
        message << "Erreur venant de la bibliothèque standard : " << e.what()
                << '\n';
        g_critical(message.str().c_str());
        return -3;
      }
      catch (...) {
        g_critical("Exception non-standard.\n");
        return -4;
      }
    }
    Test, voies si tu t�en sors et confirme-le ici. Par ailleurs, je te signale que je d�pose la conversion des tutoriels NeHe en GtkGlExtmm d�s ce soir sur la plate-forme de t�l�chargement de D�veloppez.com. Je pr�pare quelques tutoriels pour donner les �l�ments qui peuvent pi�ger.

    � bient�t.

    Le Farfadet Spatial

  10. #10
    Membre chevronn� Avatar de straasha
    Homme Profil pro
    D�veloppeur en syst�mes embarqu�s
    Inscrit en
    Juillet 2004
    Messages
    149
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur en syst�mes embarqu�s
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par d�faut
    D�sol� pour le silence, j'ai eu pas mal d�impr�vu la semaine derni�re, mais je vais pouvoir m'y remettre cette semaine.

    Dans tes fichiers de gestion du projet � que ce soit Make, Autotools, CMake, Scons ou autre �, il faut ajouter � gtkglextmm �. Pkg-config g�re de mani�re standard GtkGlExt, donc il suffit d�ajouter quelque chose d�approchant ceci :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    pkg-config gtkglextmm-1.2 --cflags --libs
    C'est justement cette partie que je ne maitrise pas du tout, est ce que tu pourrai la d�tailler ?
    J'ai fait mon projet sous Code::Block mais je pense qu'il faut compiler d'abord ces librairies s�par�ment donc j'ai essay� de suivre le README.win32 trouv� dans le r�pertoire gtkglextmm-1.2.0 : il indique qu'il faut en pr�-requis avoir compil� gtkglext-1.2.0. J'ai donc suivi le README.win32 trouv� dans gtkglext-1.2.0 et en ex�cutant les instructions sous cygwin, je suis tomb� sur le message suivant :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    checking for BASE_DEPENDENCIES... configure: error: Package requirements (gtk+-2.0 >= 2.0.0 gdk-2.0 >= 2.0.0 pango >= 1.0.0 pangox >= 1.0.0 gmodule-2.0 >= 2.0.0 ) were not met:
     
    No package 'pangox' found
    C'est quoi ce pangox ? J'ai l�impression qu'il devrai plut�t chercher pangowin32 vu que je suis sous win et pas sous x11. Si c'est �a, je devrai juste avoir une option � fixer quelque part, mais o� ?

    Si il y a une m�thode pour compiler tout �a tout en restant sous Code::Block, je suis preneur

  11. #11
    Membre �clair�
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de pr�cision�
    Inscrit en
    Avril 2008
    Messages
    190
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : En cours de pr�cision�

    Informations forums :
    Inscription : Avril 2008
    Messages : 190
    Par d�faut
    Salut � tous !

    Citation Envoy� par straasha Voir le message
    C'est justement cette partie que je ne maitrise pas du tout, est ce que tu pourrai la d�tailler ?
    Sp�cialement pour configurer un projet selon la m�thode non standard qu�utilise de base Code::Blocks ? Non : je n�utilise pas Code::Blocks et pour tout dire, je ne comprends pas l�engouement pour cet environnement. Maintenant, pour d�couvrir, utiliser la gestion de projet non standard de Code::Blocks peut �tre envisag�. Cela dit, les environnements, �a passe et il vaut mieux utiliser des m�thodes standards et portables : �a permet de ne pas se bloquer dans un environnement de d�veloppement particulier.

    Cela dit, tu as r�ussi � configurer Code::Blocks pour utiliser Gtkmm, c�est la m�me fa�on de proc�der avec GtkGlExtmm.

    Si je me r�f�re � ce que l�on trouve sur Internet, il faut que tu te rendes dans Project → Build options → Compiler settings → Other options et que tu y ajoutes � ajouter, pas remplacer � ceci :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    `pkg-config --cflags gtkglextmm-1.2`
    Puis, il faut aller dans Project → Build options → Linker settings → Other linker et ajouter � encore une fois, ne pas remplacer � ceci :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    `pkg-config --libs gtkglextmm-1.2`
    J'ai fait mon projet sous Code::Block mais je pense qu'il faut compiler d'abord ces librairies s�par�ment
    Pourquoi ? Si tu as utilis� l�installateur Windows de Gtk, les biblioth�ques sont d�j� compil�es. As-tu utilis� l�installateur Windows ? D�ailleurs, as-tu compil� Gtkmm � je ne pense pas, sinon tu ne poserais sans doute pas ces questions ?

    Vu que tu as �t� capable de compiler un code Gtkmm, il ne devrait rien avoir de particulier.

    C'est quoi ce pangox ?
    Sauf erreur de ma part, la version pour XWindows de Pango, la biblioth�que de rendu des polices de caract�res qu�utilise Gtk+.

    � bient�t.

    Le Farfadet Spatial

Discussions similaires

  1. (ANN] Demo de Gtk et OpenGL
    Par poincare dans le forum GTK+ avec C & C++
    R�ponses: 0
    Dernier message: 16/04/2013, 22h54
  2. GTK+ et Opengl
    Par chanCH dans le forum Biblioth�ques, syst�mes et outils
    R�ponses: 4
    Dernier message: 30/04/2011, 14h11
  3. Gtk avec OpenGl
    Par acryline dans le forum GTK+ avec C & C++
    R�ponses: 6
    Dernier message: 29/08/2010, 09h48
  4. GTK et OPENGL avec gtkglarea
    Par Vincent|Dev dans le forum OpenGL
    R�ponses: 1
    Dernier message: 09/02/2005, 13h33

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