Partage
  • Partager sur Facebook
  • Partager sur Twitter

[OpenGL] - Comment passer un GLuint à une méthode ? -

Passage par valeur, référence ou pointeur ?

Sujet résolu
    22 juin 2007 à 20:47:26

    Salut à tous !

    Alors voila j'ai un petit problème avec deux de mes classes. Je suis en OpenGL couplé de la SDL.

    Donc voila, je vous simplifie le truc, mais l'idée reste la même : j'ai une classe nommée Display

    // Classe Display
    class Display
    {
            public :
                Display();
                ~Display(){};

                void Actualise();

            private :
                Textures tex; // Pack of textures
                SDL_Event action;
                bool again;
    };


    et une classe nommée Shape

    // Classe Shape

    class Shape
    {
        public :
            Shape(double W, double H, double D, unsigned int R, unsigned int G, unsigned int B, GLuint texture, double X, double Y, double Z);
            ~Shape(){};

            void Draw();

        private :
            double w; // Weidth
            double h; // High
            double d; // Depth

            double x; // X
            double y; // Y
            double z; // Z

            unsigned int r; // Red
            unsigned int g; // Green
            unsigned int b; // Blue

            GLuint tex; // Texture
    };


    La méthode Display::Actualise se charge en fait de faire un traitement itératif évènementiel que voici :


    void Display::Actualise()
    {
        Shape rect(5, 5, 5, 255, 0, 0, tex.metal, 0, 0, 0);

        while (again)
        {
            SDL_WaitEvent(&action);

            switch (action.type)
            {
                case SDL_QUIT :
                    again = false;
                    break;
            }

            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clean the Color Buffer bit and the Z-Buffer

            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();

            gluLookAt(6, 8, 15, 0, 0, 0, 0, 1, 0);

            rect.Draw();

            glFlush();
            SDL_GL_SwapBuffers();
        }

    }


    Vous devez comprendre ce code ^^ Au début, juste avant la boucle, il crée une nouvelle instance de Shape. Voici le constructeur de Display


    Display::Display()
    {
        again = true;

        tex.briques = loadTexture("Textures/tex_Brik.jpg", true);
        tex.herbe = loadTexture("Textures/tex_Vegetal.jpg", true);
        tex.metal = loadTexture("Textures/tex_Metal.jpg", true);

    }


    Comme vous l'aurez compris, je charge mes textures dans le constructeur de Display.

    Voici ensuite l'implémentation du constructeur de Shape



    Shape::Shape(double W, double H, double D, unsigned int R, unsigned int G, unsigned int B, GLuint texture, double X, double Y, double Z)
    {
        w = W;
        h = H;
        d = D;

        r = R;
        g = G;
        b = B;

        tex = texture;

        x = X;
        y = Y;
        z = Z;

    }


    J'initialise les attribus en fonction des paramètres (au début j'avais un truc du genre Shape() : attribu1(X), attribu2(Y);, mais ça ne marche pas pour les structures de GLuint o_O ).

    Voici maintenant l'implémentation de la fameuse méthode Shape::Draw()


    {
        glBindTexture(GL_TEXTURE_2D, tex);

        glBegin(GL_QUADS);
            glColor3ub(r, g, b); // Color of rectangle

            // Front plane
            glTexCoord2d(0, 0);    glVertex3d((x - w) / 2, (y - h) / 2, (z + d) / 2);
            glTexCoord2d(0, 1);    glVertex3d((x - w) / 2, (y + h) / 2, (z + d) / 2);
            glTexCoord2d(1, 1);    glVertex3d((x + w) / 2, (y + h) / 2, (z + d) / 2);
            glTexCoord2d(1, 0);    glVertex3d((x + w) / 2, (y - h) / 2, (z + d) / 2);

            // Right plane
            glVertex3d((x + w) / 2, (y - h) / 2, (z + d) / 2);
            glVertex3d((x + w) / 2, (y + h) / 2, (z + d) / 2);
            glVertex3d((x + w) / 2, (y + h) / 2, (z - d) / 2);
            glVertex3d((x + w) / 2, (y - h) / 2, (z - d) / 2);

            // Back plane
            glVertex3d((x + w) / 2, (y - h) / 2, (z - d) / 2);
            glVertex3d((x + w) / 2, (y + h) / 2, (z - d) / 2);
            glVertex3d((x - w) / 2, (y + h) / 2, (z - d) / 2);
            glVertex3d((x - w) / 2, (y - h) / 2, (z - d) / 2);

            // Left plane
            glVertex3d((x - w) / 2, (y - h) / 2, (z - d) / 2);
            glVertex3d((x - w) / 2, (y + h) / 2, (z - d) / 2);
            glVertex3d((x - w) / 2, (y + h) / 2, (z + d) / 2);
            glVertex3d((x - w) / 2, (y - h) / 2, (z + d) / 2);

            // Top plane
            glVertex3d((x - w) / 2, (y + h) / 2, (z + d) / 2);
            glVertex3d((x - w) / 2, (y + h) / 2, (z - d) / 2);
            glVertex3d((x + w) / 2, (y + h) / 2, (z - d) / 2);
            glVertex3d((x + w) / 2, (y + h) / 2, (z + d) / 2);

            // Under plane
            glVertex3d((x - w) / 2, (y - h) / 2, (z + d) / 2);
            glVertex3d((x - w) / 2, (y - h) / 2, (z - d) / 2);
            glVertex3d((x + w) / 2, (y - h) / 2, (z - d) / 2);
            glVertex3d((x + w) / 2, (y - h) / 2, (z + d) / 2);

        glEnd();

    }


    Lorsque je debug le code, la texure métal n'apparait pas, mais juste le rouge ! Voici donc ma question : soit une texture chargée dans la méthode d'une classe A. Soit B une classe ayant besoin d'utiliser la texture de la classe A. Sachant que la classe B est instancier dans une méthode de la A, on peut faire passer la texture. Mais faut-il le faire par valeur, référence ou pointeur ? Je pense que le pointeur serait le mieux adapté mais je ne vois pas comment faire. Sinon si l'on passe une "copie" (donc par valeur), est-ce que la surface peut être bien utilisée ?

    Merci de vos réponses, j'espère avoir été compréhensible
    • Partager sur Facebook
    • Partager sur Twitter
      23 juin 2007 à 5:53:05

      Je ne connais strictement rien à OpenGL, mais si Gluint est une structure alors la ligne

      tex = texture


      Ne fera probablement pas ce que tu attends

      Tu as plusieurs solutions.

      • faire une copie membre à membre
      • te faire ta propre structure et la doter des méthodes qui vont bien (constructeur et opérateurs)
      • Partager sur Facebook
      • Partager sur Twitter
      Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
        23 juin 2007 à 10:39:30

        GLuint est un entier.
        Vérifie que tu regardes bien la face texturée et pas une autre.
        • Partager sur Facebook
        • Partager sur Twitter
          23 juin 2007 à 13:37:48

          J'y est bien fait attention, je regarde bien la bonne face, la texture n'apparait pas. Est-ce que cela vient-il du fait que j'essaie d'affecter à tex une copie d'une texture ? J'ai essayé par pointeur, en faisant passé au contructeur de Shape un pointeur sur la texture

          Shape(/*Paramètres...*/ GLuint *texture);


          Et quand je veux créer mon objet,

          Shape rectangle(5, 5, 5, 255, 0, 0, tex->briques, 0, 0, 0);


          J'affecte ensuite à Shape::tex la valeur du pointeur, mais le code plante, il ne veut pas faire passer de pointeur sur GLuint o_O

          EDIT : Et je précise aussi que GLuint est, comme l'a dit Pole, un entier. Textures est une structure que j'ai moi même créée


          struct Textures
          {
              GLuint briques;
              GLuint herbes;
              GLuint metal;
          };
          • Partager sur Facebook
          • Partager sur Twitter
            23 juin 2007 à 13:56:31

            As-tu chargés tes textures avant la création du contexte OpenGL (le SDL_Init)?
            • Partager sur Facebook
            • Partager sur Twitter
              23 juin 2007 à 13:59:35

              Non, elle sont chargée bien après dans le code (constructeur de Display).
              • Partager sur Facebook
              • Partager sur Twitter
                23 juin 2007 à 15:29:02

                Envoie tout le code alors.
                • Partager sur Facebook
                • Partager sur Twitter
                  23 juin 2007 à 21:28:31

                  Non c'est bon, j'ai enfin trouvé !

                  Le problème venait en fait du constructeur, je ne sais pas pourquoi mais il ne chargeais pas les textures. J'ai fais une méthode et tout se passe très bien !

                  Merci tout le monde ! ^^
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [OpenGL] - Comment passer un GLuint à une méthode ? -

                  × 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