/*
* Automatisch generierter Glut/OpenGL-C-Code.
* Kompilieren unter Linux: gcc -lglut <Dateiname>
* Herkunft: Tinyray (http://www.stefan-baur.de)
*/
#include <stdlib.h>
#include <GL/glut.h>
#define WIDTH 600
#define HEIGHT 400
// Globle Variablen für die Kamerabewegung
int mousemotion = 0;
int mousex = 0;
int mousey = 0;
GLfloat anglex = 0.0f;
GLfloat angley = 0.0f;
// Programm verlassen
void actionQuit()
{
exit(EXIT_SUCCESS);
}
// Initialisierung: Kameraposition
void actionInit()
{
mousex = 0;
mousey = 0;
anglex = 0.0f;
angley = 0.0f;
}
// Licht ein/aus
void actionToggleLighting()
{
if (glIsEnabled(GL_LIGHTING))
{
glDisable(GL_LIGHTING);
}
else
{
glEnable(GL_LIGHTING);
}
}
// Nebel ein/aus
void actionToggleFog()
{
if (glIsEnabled(GL_FOG))
{
glDisable(GL_FOG);
}
else
{
glEnable(GL_FOG);
}
}
// Shade flat/smooth
void actionToggleShadeModel()
{
int shadeModel;
glGetIntegerv(GL_SHADE_MODEL, &shadeModel);
if (shadeModel == GL_SMOOTH)
{
glShadeModel(GL_FLAT);
}
else
{
glShadeModel(GL_SMOOTH);
}
}
// Callback-Funktion: MouseFunc
void mouse(int button, int state, int x, int y)
{
mousemotion = (button == GLUT_LEFT_BUTTON) && (state == GLUT_DOWN);
if (mousemotion)
{
mousex = x;
mousey = y;
}
}
// Callback-Funktion: MotionFunc
void motion(int x, int y)
{
if (mousemotion)
{
anglex += (GLfloat)(y - mousey);
angley += (GLfloat)(x - mousex);
mousex = x;
mousey = y;
// Szene erneut zeichen
glutPostRedisplay();
}
}
// Callback-Funktion: KeyboardFunc
void keyboard(unsigned char keyPressed, int x, int y)
{
switch (keyPressed)
{
// Quit
case '0': case 'q': case 'Q': case 27:
actionQuit();
break;
// Init
case '1': case 'i': case 'I':
actionInit();
break;
// Toggle Lighting
case '2': case 'l': case 'L':
actionToggleLighting();
break;
// Toggle Fog
case '3': case 'f': case 'F': case 'n': case 'N':
actionToggleFog();
break;
// Toggle ShadeModel
case '4': case 's': case 'S':
actionToggleShadeModel();
break;
}
// Szene erneut zeichen
glutPostRedisplay();
}
// Menü-Handler
void menu(int menuItem)
{
switch (menuItem)
{
// Quit
case 0:
actionQuit();
break;
// Init
case 1:
actionInit();
break;
// Toggle Lighting
case 2:
actionToggleLighting();
break;
// Toggle Fog
case 3:
actionToggleFog();
break;
// Toggle ShadeModel
case 4:
actionToggleShadeModel();
break;
}
// Szene erneut zeichen
glutPostRedisplay();
}
// Callback-Funktion: ReshapeFunc
void reshape(int width, int height)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat aspect = (GLfloat)width / (GLfloat)height;
gluPerspective(30.0f, aspect, 0.1f, 1000.0f);
glViewport(0, 0, width, height);
}
// Callback-Funktion: DisplayFunc
void display(void)
{
// Initialisierungen vor dem Zeichen
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Hintergrundfarbe setzen
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// Nebel
glFogi(GL_FOG_MODE, GL_EXP2);
glFogfv(
GL_FOG_COLOR,
(GLfloat[]) { 0.0f, 0.0f, 0.0f }
);
glFogf(
GL_FOG_DENSITY,
0.0f
);
// Kamera setzen
gluLookAt(
0.0f, 0.0f, 10.0f, // location
0.0f, 0.0f, 0.0f, // lookAt
0.0f, 1.0f, 0.0f // up
);
// Rundumbewegung mit Transformationen ermöglichen
glTranslatef(0.0f, 0.0f, 0.0f); // <- lookAt
glRotatef(anglex, 1.0f, 0.0f, 0.0f);
glRotatef(angley, 0.0f, 1.0f, 0.0f);
glTranslatef(0.0f, 0.0f, 0.0f); // -> lookAt
// Globales, ambientes Umgebungslicht setzen
glLightModelfv(
GL_LIGHT_MODEL_AMBIENT,
(GLfloat[]) { 1.0f, 1.0f, 1.0f, 1.0f }
);
// Lichtquellen setzen
// Sonne 0 setzen
glLightfv(
GL_LIGHT0 + 0,
GL_AMBIENT,
(GLfloat[]) { 0.0f, 0.0f, 0.0f, 1.0f }
);
glLightfv(
GL_LIGHT0 + 0,
GL_DIFFUSE,
(GLfloat[]) { 1.0f, 1.0f, 1.0f, 1.0f }
);
glLightfv(
GL_LIGHT0 + 0,
GL_SPECULAR,
(GLfloat[]) { 1.0f, 1.0f, 1.0f, 1.0f }
);
glLightfv(
GL_LIGHT0 + 0,
GL_POSITION,
(GLfloat[]) { 1.0f, 1.0f, 1.0f, 0.0f }
);
glEnable(GL_LIGHT0 + 0);
// Basismaterial
// Defaults 5
glColor3f(0.5f, 0.5f, 0.5f); // Farbe, falls Licht deaktiviert
glMaterialfv(
GL_FRONT,
GL_DIFFUSE,
(GLfloat[]) { 0.5f, 0.5f, 0.5f, 1.0f }
);
glMaterialfv(
GL_FRONT,
GL_AMBIENT,
(GLfloat[]) { 0.1f, 0.1f, 0.1f, 1.0f }
);
glMaterialfv(
GL_FRONT,
GL_SPECULAR,
(GLfloat[]) { 0.5f, 0.5f, 0.5f, 1.0f }
);
glMaterialf(
GL_FRONT,
GL_SHININESS,
1000.0f
);
// Mirror = 0.4f wird nicht unterstützt!
// Geoobjekte setzen
/* > Sphere */
// Parameters 0
glPushMatrix();
glTranslatef(0.0f, 0.0f, 0.0f);
glutSolidSphere(2.0f, 30, 30);
glPopMatrix();
// Defaults 0
/* < Sphere */
glutSwapBuffers();
}
// Die Hauptfunktion
int main(int argc, char* argv[])
{
// Glut-Fenster
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(WIDTH, HEIGHT);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
// Ein Popup-Menu anbinden
glutCreateMenu(menu);
glutAddMenuEntry("Startposition", 1);
glutAddMenuEntry("Lichter ein/aus", 2);
glutAddMenuEntry("Nebel ein/aus", 3);
glutAddMenuEntry("Shade flat/smooth", 4);
glutAddMenuEntry("Programm verlassen", 0);
glutAttachMenu(GLUT_RIGHT_BUTTON);
// OpenGL-Einstellungen
glEnable(GL_LIGHTING);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glEnable(GL_NORMALIZE);
glEnable(GL_FOG);
glShadeModel(GL_SMOOTH);
// Zunächst Szene darstellen
reshape(WIDTH, HEIGHT);
display();
// Callback-Funktionen integrieren
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutMainLoop();
return EXIT_SUCCESS;
}
/* Quelle: Tinyray-Code
Tinyray {
Camera {
[0.0, 0.0, 10.0]; // Location
[0.0, 0.0, 0.0]; // Look At
[0.0, 1.0, 0.0] // Up
}
Ambience {
[1.0, 1.0, 1.0] // Color
}
Background {
[0.0, 0.0, 0.0] // Color
}
Fog {
[0.0, 0.0, 0.0]; // Color
0.0 // Density
}
Sun {
[1.0, 1.0, 1.0]; // Direction
[1.0, 1.0, 1.0] // Color
}
Sphere {
[0.0, 0.0, 0.0]; // Center
2.0 // Radius
}
}
*/
|