/* examples/glarea/zbuffer.c */ #include He_node *princ, *panel, *glarea; void princ_resize (He_node *hn, int width, int height) { HeExpand (panel, NULL, HE_RIGHT); HeExpand (glarea, NULL, HE_BOTTOM_RIGHT); } void butt_proc (He_node *hn) { HeQuit(0); } void glarea_init_proc (He_node *hn) { glEnable(GL_DEPTH_TEST); } void glarea_repaint_proc (He_node *hn) { /* Mode perspective : au lieu de le faire une seule fois dans * l'InitProc, on le fait à chaque fois : ça permet de conserver * les proportions de perspective. */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60, (GLdouble) HeGetWidth(hn)/HeGetHeight(hn), 1, 100); /* Coordonnées de la scène : * on recule tout ce qui va être dessiné ; de la sorte on peut * travailler avec des z autour de 0, et pas uniquement < 0. */ glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslated (0, 0, -4); /* Init du fond (noir opaque) et du Zbuffer */ glClearColor(0,0,0,1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1,0,0); /* Rouge */ glBegin(GL_TRIANGLES); glVertex3f(-1, -1, 0.5); glVertex3f(0, 1, 0.5); glVertex3f(1, -1, 0.5); glEnd(); glColor3f(0,1,0); /* Vert */ glBegin(GL_TRIANGLES); glVertex3f(1, 1, -0.5); glVertex3f(-1, 0.3, 1.5); glVertex3f(0.8, -2, -0.5); glEnd(); } int main (int argc, char *argv[]) { int attr_list[] = { GLX_RGBA, /* Codage couleurs */ GLX_DOUBLEBUFFER, /* Double buffer */ GLX_DEPTH_SIZE, 1, /* Zbuffer */ None }; HeInit (&argc, &argv); princ = HeCreateFrame(); HeSetFrameLabel (princ, "Perspective et Zbuffer"); HeSetFrameResizeProc (princ, princ_resize); panel = HeCreatePanel (princ); HeCreateButtonP (panel, "Quit", butt_proc, NULL); HeFit(panel); glarea = HeCreateGLArea (princ, attr_list, NULL); HeSetY (glarea, HeGetHeight(panel)+2); HeSetWidth (glarea, 500); HeSetHeight (glarea, 400); HeSetGLAreaInitProc (glarea, glarea_init_proc); HeSetGLAreaRepaintProc (glarea, glarea_repaint_proc); HeFit (princ); return HeMainLoop (princ); }