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; }