Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C++] SDL+OpenGL: afficher du texte

    14 mai 2006 à 19:48:06

    Salut!
    J'ai lu le super tuto de Kayl et je suis en train de me faire une pièce en 3D pour m'entrainer.
    J'ai mis notamment un distributeur de boissons :p
    Et je voudrais que quand on est devant, si on appuie sur espace, il affiche un texte du style "que voulez vous prendre?".

    Mon problème n'est pas dans la gestion des évenements mais l'affichage du texte en lui même.
    J'ai pensé à créer une SDL_Surface et à la blitter... Evidemment ca marche pas!

    En cherchant avec mon ami google, j'ai entendu parler d'un certain SDL_OPENGLBLIT, mais qui serait dépassé, et de toute facon, j'ai pas réussi à m'en servir.

    Donc ma question est:
    Suis-je obligé de passer par OpenGL pour afficher ce que je veux ou puis-je toujours blitter des surfaces SDL?
    Sinon, je pense qu'il faille que je créée une surface 3D qui se déplace avec la caméra? Mais à ce moment la, comment afficher du texte?

    Merci à tous ceux qui ont eu le courage de lire jusqu'ici, et encore plus à ceux qui sauront me répondre :-°:p
    • Partager sur Facebook
    • Partager sur Twitter
      14 mai 2006 à 19:49:47

      Bon j'avais prévu d'en parler dans un petit moment, mais je vais te filer un code d'exemple et je te chargerai de le balancer à tous ceux qui poseront la question ! :)
      • Partager sur Facebook
      • Partager sur Twitter
        14 mai 2006 à 19:54:18

        Je suis trop impatient ^^
        Et toi t'es trop rapide! :o
        Merci pour cette réponse-éclair ;)
        • Partager sur Facebook
        • Partager sur Twitter
          14 mai 2006 à 20:38:43

          Voilà une solution rapide qui devrait te dépanner. Ce n'est pas parfait car je n'ai pas encore fait le chapitre en question et donc regardé en détail les meilleurs possibilité.
          Néanmoins tu devrais pouvoir t'amuser avec ça :

          A rajouter à sdlglutil.h
          void createTextureFromText(GLuint id_texture,const char * text,unsigned int * width,unsigned int * height);


          A rajouter à sdlglutils.cpp

          #include <SDL/SDL_ttf.h>



          void createTextureFromText(GLuint id_texture,const char * text,unsigned int * width,unsigned int * height)
          {
              SDL_Surface * texte_surface,*gl_surface,*gl_fliped_surface;
              TTF_Font *font;
              Uint32 rmask, gmask, bmask, amask;
              SDL_Color textColor = { 255, 255, 255 };
              font = TTF_OpenFont( "arial.ttf", 24 );
              texte_surface = TTF_RenderText_Solid(font,text,textColor);

              *width = texte_surface->w;
              *height = texte_surface->h;

          #if SDL_BYTEORDER == SDL_BIG_ENDIAN

              rmask = 0xff000000;
              gmask = 0x00ff0000;
              bmask = 0x0000ff00;
              amask = 0x000000ff;
          #else

              rmask = 0x000000ff;
              gmask = 0x0000ff00;
              bmask = 0x00ff0000;
              amask = 0xff000000;
          #endif

              SDL_PixelFormat format = *(texte_surface->format);
              format.BitsPerPixel = 32;
              format.BytesPerPixel = 4;
              format.Rmask = rmask;
              format.Gmask = gmask;
              format.Bmask = bmask;
              format.Amask = amask;

              gl_surface = SDL_ConvertSurface(texte_surface,&format,SDL_SWSURFACE);

              gl_fliped_surface = flipSurface(gl_surface);

              glBindTexture(GL_TEXTURE_2D,id_texture);

              gluBuild2DMipmaps(GL_TEXTURE_2D, 4, gl_fliped_surface->w,
                                    gl_fliped_surface->h, GL_RGBA,GL_UNSIGNED_BYTE,
                                    gl_fliped_surface->pixels);
              glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
              glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);


              SDL_FreeSurface(gl_surface);
              SDL_FreeSurface(gl_fliped_surface);
              SDL_FreeSurface(texte_surface);
              TTF_CloseFont( font );
          }


          A l'init de ton programme

          //variables globales
          GLuint texte;
          unsigned int width_texte;
          unsigned int height_texte;


          TTF_Init();
          glGenTextures(1, &texte);
          createTextureFromText(texte,"coucou les zéros",&width_texte,&height_texte);



          Puis lors du dessin :
          glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

              glMatrixMode( GL_PROJECTION );
              glLoadIdentity( );
              gluPerspective(70,(double)LARGEUR_FENETRE/HAUTEUR_FENETRE,1,1000);

              glMatrixMode( GL_MODELVIEW );
              glLoadIdentity( );

          //tout le bordel 3D
          // !!!!! PUIS !!!!!!

          glMatrixMode( GL_PROJECTION );
              glLoadIdentity( );
              gluOrtho2D(0,LARGEUR_FENETRE,0,HAUTEUR_FENETRE);
              glDisable(GL_DEPTH_TEST);

              glMatrixMode( GL_MODELVIEW );
              glLoadIdentity( );

              glEnable(GL_BLEND);
              glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

              glTranslated(LARGEUR_FENETRE/2-width_texte/2,HAUTEUR_FENETRE/2-height_texte/2,0);

              glColor4ub(255,255,255,255);
              glBindTexture(GL_TEXTURE_2D, texte);
              glBegin(GL_QUADS);
              glTexCoord2i(0,0); glVertex2i(0,0);
              glTexCoord2i(1,0); glVertex2i(width_texte,0);
              glTexCoord2i(1,1); glVertex2i(width_texte,height_texte);
              glTexCoord2i(0,1); glVertex2i(0,height_texte);
              glEnd();

              glEnable(GL_DEPTH_TEST);
              glDisable(GL_BLEND);


          Et voilà :
          Image utilisateur

          Pas plus d'explications car le chapitre le fera. J'en ai suffisamment dit je pense.
          • Partager sur Facebook
          • Partager sur Twitter
            14 mai 2006 à 21:53:45

            Ok merci beaucoup!
            J'aurais du y penser au lieu de cherger l'image tu crées une surface avec SDL_ttf et tu la transformes en texture.

            D'ailleurs, j'ai remaqué qu'une texture créée à partir d'une image est inversée.
            J'ai donc refait une petite fonction (j'en ai bavé lol) pour la remettre à l'endroit (inversée Gauche/Droite, comme dans un rétroviseur, pas pratique quand y'a du texte dessus).

            Merci beaucoup ;)
            • Partager sur Facebook
            • Partager sur Twitter
              14 mai 2006 à 21:54:56

              Oui en effet c'est inversé. Si tu regardes le code de sdlglutils la premiere chose que je fais dès que j'ai une surface (image ou texte), je la retourne (haut bas). Si tu la retournes gauche droite c'est que tu te plantes qq part dans la maniere d'utiliser les coordonées de texture.
              • Partager sur Facebook
              • Partager sur Twitter
                14 mai 2006 à 22:15:06

                Lol mon repère était inversé -_-
                Je me demandais aussi pourquoi l'image était retournée alors comme un c*n j'ai recodé une fonction qui l'inverse pixel par pixel xD
                Merci beaucoup en tous cas ;)
                • Partager sur Facebook
                • Partager sur Twitter

                [C++] SDL+OpenGL: afficher du texte

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown