#include #include #include #include #include #define SHARED /* shared library benutzen */ #define GL_APICOMPATIBLE /* stubs aus cybergl.lib nutzen */ #include "cybergl.h" /* cybergl Datentypen */ #include "cybergl_protos.h" /* cybergl Prototypen */ #include "display.h" /* cybergl Fensterfunktionen */ #include "cybergl_pragmas.h" /* cybergl Pragmas */ extern struct Library *CyberGLBase; /* cybergl Library Base */ #define WIDTH 400 /* Fensterbreite */ #define HEIGHT 300 /* Fensterhöhe */ void drawCube (void) /* Würfel zeichnen */ { glBegin (GL_QUADS); /* Vierecke ... */ glNormal3d ( 0.0, 0.0, 1.0); /* Normale für erste Fläche */ glVertex3d (-0.5, -0.5, 0.5); glVertex3d ( 0.5, -0.5, 0.5); glVertex3d ( 0.5, 0.5, 0.5); glVertex3d (-0.5, 0.5, 0.5); /* erste Fläche ok */ glNormal3d ( 1.0, 0.0, 0.0); /* Normale für zweite Fläche */ glVertex3d ( 0.5, -0.5, 0.5); glVertex3d ( 0.5, -0.5, -0.5); glVertex3d ( 0.5, 0.5, -0.5); glVertex3d ( 0.5, 0.5, 0.5); /* zweite Fläche ok */ glNormal3d ( 0.0, 0.0, -1.0); /* Normale für dritte Fläche */ glVertex3d ( 0.5, -0.5, -0.5); glVertex3d (-0.5, -0.5, -0.5); glVertex3d (-0.5, 0.5, -0.5); glVertex3d ( 0.5, 0.5, -0.5); /* dritte Fläche ok */ glNormal3d (-1.0, 0.0, 0.0); /* Normale für vierte Fläche */ glVertex3d (-0.5, -0.5, -0.5); glVertex3d (-0.5, -0.5, 0.5); glVertex3d (-0.5, 0.5, 0.5); glVertex3d (-0.5, 0.5, -0.5); /* vierte Fläche ok */ glNormal3d ( 0.0, 1.0, 0.0); /* Normale für fünfte Fläche */ glVertex3d (-0.5, 0.5, 0.5); glVertex3d ( 0.5, 0.5, 0.5); glVertex3d ( 0.5, 0.5, -0.5); glVertex3d (-0.5, 0.5, -0.5); /* fünfte Fläche ok */ glNormal3d ( 0.0, -1.0, 0.0); /* Normale für sechste Fläche */ glVertex3d (-0.5, -0.5, -0.5); glVertex3d ( 0.5, -0.5, -0.5); glVertex3d ( 0.5, -0.5, 0.5); glVertex3d (-0.5, -0.5, 0.5); /* sechste Fläche ok */ glEnd (); /* ... und fertig */ } void main (int argc, char *argv[]) { void *glWindow; /* unser cybergl-Fenster */ GLfloat lightDirection [4] = /* Lichtquellenposition */ {1.0F, 2.0F, 1.5F, 1.0F}; /* strahlt Richtung (0,0,0) */ GLfloat diffuseColor [4] = /* Diffuse Materialfarbe */ {1.0F, 0.1F, 0.0F, 1.0F}; /* knalliges Rot */ glWindow = openGLWindowTags (WIDTH, HEIGHT, /* Fenster öffnen */ GLWA_Title, "Cube", /* Titel */ GLWA_DragBar, TRUE, /* Ziehbar */ GLWA_CloseGadget, TRUE, /* Schließbutton */ GLWA_DepthGadget, TRUE, /* Depth-Button */ GLWA_IDCMP, IDCMP_CLOSEWINDOW, /* Messages */ GLWA_RGBAMode, GL_TRUE, /* CyberGL RGBA-Mode */ TAG_DONE); if (glWindow) /* Fenster geöffnet ? */ { glMatrixMode (GL_PROJECTION); /* Projektion einstellen */ glPerspective (40.0, 1.333, 0.5, 50.5); /* 40 Grad, 4:3 */ glMatrixMode (GL_MODELVIEW); /* Kamera einstellen */ glLookAt (1.0, 1.5, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); /* Color buffer und Z-Buffer löschen */ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable (GL_CULL_FACE); /* backface culling ein */ glEnable (GL_DEPTH_TEST); /* Z-Buffer Test ein */ glEnable (GL_LIGHTING); /* Beleuchtung ein */ glEnable (GL_LIGHT0); /* Lichtquelle 0 ein */ glMaterialfv (GL_FRONT, GL_DIFFUSE, diffuseColor); /* Material */ glLightfv (GL_LIGHT0, GL_POSITION, lightDirection); /* pos */ drawCube (); /* Würfel zeichnen */ Wait (1 << getWindow (glWindow)->UserPort->mp_SigBit); closeGLWindow (glWindow); } }