Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ah, les pointeurs !

Ma propre structure

    8 mai 2008 à 12:26:27

    Bonjour, alors voilà, j'esseye d'apprendre openGL avec les tutos de nehe (et un peu du SdZ) mais comme je n'aime pas du tout sa manière de coder (80 % de variables globales, apiWindows => programme non-portable), j'ai décider de réorganiser tout ça notamment grâce à une structure "Data".

    Mais là j'ai un problème pour passer un pointeur de ma structure data à ma fonction dessiner(Data *data)
    Hop hop hop, je suis sur que le soulution est simple, mais là je bloque bêtement.
    Si quelqu'un pouvait me sortir de ce mauvais pas ça serait sympa !


    main.cpp (compile sans erreur)
    #include "header.h"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        SDL_Event event;
        bool turn = false, loop = true, light = false;
        SDL_Rect current_mouse, last_mouse;
        last_mouse.x = 0;
        last_mouse.y = 0;
    
        /* Création des données dans le fichier main.cpp
         * d'une manière un peu bourrine :
         * toute la structure est renvoyée dans le return
         * mais bon ça, ça patientera  
         */ 
        Data data = creer_donnees();
    
    
        //initialisatin SDL
        SDL_Init(SDL_INIT_VIDEO);
        atexit(SDL_Quit);
        SDL_WM_SetCaption("SDL GL Application", NULL);
        SDL_SetVideoMode(640, 480, 32, SDL_OPENGL | SDL_GL_DOUBLEBUFFER);
    
        //initialisation OpenGL
        glEnable(GL_TEXTURE_2D);
        glMatrixMode( GL_PROJECTION );
        glLoadIdentity();
        gluPerspective(70,(double)640.0/480.0,1,1000);
        glEnable(GL_DEPTH_TEST);
        glLightfv(GL_LIGHT1, GL_AMBIENT, data.lum[0].col);
        glLightfv(GL_LIGHT1, GL_DIFFUSE, data.lum[1].col);
        glLightfv(GL_LIGHT1, GL_POSITION, data.lum[1].pos);
        glEnable(GL_LIGHT1);
        glEnable(GL_LIGHTING);
    
        //1er affichage de la scene
        dessiner(&data);
    
        //initialistion des compteur
        Uint32 last_time = SDL_GetTicks();
        Uint32 current_time,ellapsed_time;
        Uint32 start_time;
    
        //boucle principale
        while(loop)
        {
        start_time = SDL_GetTicks();
            while (SDL_PollEvent(&event))
            {
            /*
            blablabla...
            */
            }
    
            //Gestion des FPS
            current_time = SDL_GetTicks();
            ellapsed_time = current_time - last_time;
            last_time = current_time;
    
            if(turn)
            {
                data.angle[0] += 0.5 * (current_mouse.x - last_mouse.x);
                data.angle[1] += 0.5 * (current_mouse.y - last_mouse.y);
                last_mouse.x = current_mouse.x;
                last_mouse.y = current_mouse.y;
    
            }
    
            /*
            x += 0.05 * ellapsed_time;
            y += 0.05 * ellapsed_time;
            z += 0.05 * ellapsed_time;
            //*/
    
            //affichage de la scene
            dessiner(&data);
    
            //mise en pause du programme
            ellapsed_time = SDL_GetTicks() - start_time;
            if (ellapsed_time < 10)
            {
                SDL_Delay(10 - ellapsed_time);
            }
    
        }
    
        return EXIT_SUCCESS;
    }
    


    draw.cpp
    #include "header.h"
    
    using namespace std;
    
    void dessiner(Data* data)
    {
    
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    
        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity();
    
        //positionnement du repère : c'est ici que tout plante//
        glTranslated(data.pos[0]->x, data.pos[0].y, data.pos[0].z);
        glRotatef(data->angle[0], 0.0, 1.0, 0.0);
        glRotatef(data->angle[1], cos(data.angle[0]*PI/180.0), 0.0, sin(data.angle[0]*PI/180.0));
        glColor3ub(255, 255, 255);
        cube(data.texture[0]);
    
        glFlush();
        SDL_GL_SwapBuffers();
    }
    
    void cube(GLuint texture)
    {
        glBindTexture(GL_TEXTURE_2D, texture);
        glBegin(GL_QUADS);
    
        //face du dessus
        glNormal3d( 0, 1, 0);
            glTexCoord2d(1,1);  glVertex3d( 1, 1, 1);
            glTexCoord2d(0,1);  glVertex3d(-1, 1, 1);
            glTexCoord2d(0,0);  glVertex3d(-1, 1,-1);
            glTexCoord2d(1,0);  glVertex3d( 1, 1,-1);
    
    
        //face du dessous
        glNormal3d( 0,-1, 0);
            glTexCoord2d(0,0);  glVertex3d(-1,-1, 1);
            glTexCoord2d(0,1);  glVertex3d( 1,-1, 1);
            glTexCoord2d(1,1);  glVertex3d( 1,-1,-1);
            glTexCoord2d(1,0);  glVertex3d(-1,-1,-1);
    
        //face de droite
        glNormal3d( 1, 0, 0);
            glTexCoord2d(1,0);  glVertex3d( 1,-1, 1);
            glTexCoord2d(1,1);  glVertex3d( 1, 1, 1);
            glTexCoord2d(0,1);  glVertex3d( 1, 1,-1);
            glTexCoord2d(0,0);  glVertex3d( 1,-1,-1);
    
        //face de gauche
        glNormal3d(-1, 0, 0);
            glTexCoord2d(0,1);  glVertex3d(-1, 1, 1);
            glTexCoord2d(0,0);  glVertex3d(-1,-1, 1);
            glTexCoord2d(1,0);  glVertex3d(-1,-1,-1);
            glTexCoord2d(1,1);  glVertex3d(-1, 1,-1);
    
        //face avant
        glNormal3d( 0, 0,-1);
            glTexCoord2d(1,1);  glVertex3d( 1, 1,-1);
            glTexCoord2d(0,1);  glVertex3d(-1, 1,-1);
            glTexCoord2d(0,0);  glVertex3d(-1,-1,-1);
            glTexCoord2d(1,0);  glVertex3d( 1,-1,-1);
    
    
        //face arrière
        glNormal3d( 0, 0, 1);
            glTexCoord2d(0,0);  glVertex3d( 1,-1, 1);
            glTexCoord2d(1,0);  glVertex3d(-1,-1, 1);
            glTexCoord2d(1,1);  glVertex3d(-1, 1, 1);
            glTexCoord2d(0,1);  glVertex3d( 1, 1, 1);
    
        glEnd();
    }
    


    voici ce que me dit le compilateur (mingw)

    H:\Doc programmes\C_C++\SDL_OpenGL\draw.cpp||In function `void dessiner(Data*)':|
    H:\Doc programmes\C_C++\SDL_OpenGL\draw.cpp|14|error: request for member `pos' in `data', which is of non-class type `Data*'|
    H:\Doc programmes\C_C++\SDL_OpenGL\draw.cpp|14|error: request for member `pos' in `data', which is of non-class type `Data*'|
    H:\Doc programmes\C_C++\SDL_OpenGL\draw.cpp|16|error: request for member `angle' in `data', which is of non-class type `Data*'|
    H:\Doc programmes\C_C++\SDL_OpenGL\draw.cpp|16|error: request for member `angle' in `data', which is of non-class type `Data*'|
    H:\Doc programmes\C_C++\SDL_OpenGL\draw.cpp|18|error: invalid conversion from `Data*' to `GLuint'|
    H:\Doc programmes\C_C++\SDL_OpenGL\draw.cpp|18|error:   initializing argument 1 of `void cube(GLuint)'|
    ||=== Build finished: 7 errors, 231 warnings ===|

    (A noter que les 231 warnings sont les enums des évenement non-repris dans ma boucle principale)

    Alors comment rendre ce code comestible pour le compilateur?

    merci d'avance de vos réponses ;)

    pour ceux qui veulent compiler, voici un petit lien de mon projet code::blocks :
    Le projet code::blocks sous windows
    • Partager sur Facebook
    • Partager sur Twitter
      8 mai 2008 à 12:42:04

      Oups désolé, il y moyen de déplacer ?
      Mille excuses
      • Partager sur Facebook
      • Partager sur Twitter
        9 mai 2008 à 10:14:03

        tu passe un pointeur à ta fonction dessiner() donc il ne faut pas faire
        data.pos
        


        mais

        data->pos
        
        • Partager sur Facebook
        • Partager sur Twitter
          9 mai 2008 à 14:25:11

          même chose deux lignes en dessous.

          Tu as data->angle au début de la ligne mais ensuite tu as écrit data.angle
          • Partager sur Facebook
          • Partager sur Twitter

          Ah, les pointeurs !

          × 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