/* examples/glarea/perspective.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_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. On aurait pu le faire dans la ResizeProc ... */ 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 */ glClearColor(0,0,0,1); glClear(GL_COLOR_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(); /* Le triangle vert est censé traverser le triangle rouge ; * or ici il apparait au dessus du rouge, car il est dessiné en * second. Il faut donc activer le Zbuffer. */ } int main (int argc, char *argv[]) { int attr_list[] = { GLX_RGBA, None }; HeInit (&argc, &argv); princ = HeCreateFrame(); HeSetFrameLabel (princ, "Perspective"); 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); HeSetGLAreaRepaintProc (glarea, glarea_repaint_proc); HeFit (princ); return HeMainLoop (princ); }