Fenster erstellen mit MESA



  • kompilieren tu ich mit:

    gcc -I .-c Teapot.c
    gcc -o Teapot.out Teapot.o -lGL -lGL -lglut -lGLU

    //Teapot.c
    #include <stdio.h>
    #include <stdlib.h>
    
    #include <GL/glut.h>
    
    //Zustandsvariablen für die Mausbewegung
    int mousemotion;
    int mousex, mousey;
    
    //Initialisierung Modellorientierung
    GLfloat xangle = 4; /*In Drehung im */
    GLfloat yangle = 120;
    
    //Modellposition
    GLfloat posx = 0, posy = 0, posz = 0;
    
    //Eigenen Initialisierung (Licht etc.)
    void myinit()
    {
            GLfloat light_position[] = {0.0, 0.0, -1.0, 1.0 };
    
            //erstes GL-Light setzen
            glLightfv(GL_LIGHT0, GL_POSITION, light_position );
    
            //Licht aktivieren
            glEnable(GL_LIGHT0);
    
            //z-Puffer aktivieren
            glDepthFunc(GL_LEQUAL);
            glEnable(GL_DEPTH_TEST);
    }
    
    //Callback Reaktion auf Mausbewegung
    void mouse(int button,int state, int x, int y)
    {
            if( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
            {
                    mousemotion = 1;
                    mousex = x;
                    mousey = y;
            }
            if( button == GLUT_LEFT_BUTTON && state == GLUT_UP)
            {
                    mousemotion = 0;
            }
    }
    
    void motion(int x, int y)
    {
            if(mousemotion)
            {
                    xangle = xangle - (y - mousey);
                    yangle = yangle - (x - mousex);
                    mousex = x;
                    mousey = y;
    
                    //Szene neu zeichnen
                    glutPostRedisplay();
            }
    }
    
    void keyb(unsigned char keyPressed, int x, int y)
    {
            switch(keyPressed)
            {
                    case 'l':
                    case 'L':
                                    //Licht aktivieren
                                    glEnable(GL_LIGHTING);
                                    glutPostRedisplay();
                            break;
    
                    case 'o':
                    case 'O':
                                    //Licht deaktivieren
                                    glDisable(GL_LIGHTING);
                                    glutPostRedisplay();
                            break;
            }
    }
    
    void recalcModelPos(void)
    {
            glLoadIdentity();
            glTranslatef(posx, posy, posz);
            glRotatef(xangle, 1.0, 0.0, 0.0);
            glRotatef(yangle, 0.0, 1.0, 0.0);
    }
    
    void DrawScene(void)
    {
            //Puffer löschen
            glClearColor(0.5, 0.0, 0.0, 0.0);
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
            //neue Modellkoordinaten berechnen
            recalcModelPos();
    
            //Teekanne malen
            glutSolidTeapot(0.6);
    
            //Vorder und Hintergrund Puffer wechesln
            glutSwapBuffers();
    }
    
    //Main Funktion
    int main(int argc, char *argv[])
    {
            //glut initialisieren, Fenster setzen
            glutInit(&argc, argv);
    
            glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    
            glutInitWindowSize(500, 500);
    
            glutInitWindowPosition(100, 100);
    
            glutCreateWindow(argv[0]);
    
            //eigene Initialisierung
            myinit();
    
            //Callbacks setzen: Reaktion auf Mausklicks und Bewegungen, Tastaturaktivitäten
            glutMouseFunc(mouse);
    
            glutMotionFunc(motion);
    
            glutKeyboardFunc(keyb);
    
            //Callback zum Zeichnen der GL-Funktionen
            glutDisplayFunc(DrawScene);
    
            glutMainLoop();
    
            return EXIT_SUCCESS;
    }
    

Anmelden zum Antworten