/* examples/glarea/demotb.c */ #include He_node *princ, *panel, *glarea; He_trackball info_tb; 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) { HeTbInitRotations(&info_tb); HeTbInitFovy(&info_tb, 60, 5, 120); HeTbInitZdist(&info_tb, 4, 1, 10); 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( HeTbGetFovy(&info_tb), (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, -HeTbGetZdist(&info_tb)); /* On tourne le repère d'après le trackball */ HeTbMultRotations(&info_tb); /* 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(); } void glarea_event_proc (He_node *hn, He_event *hev) { switch (hev->type) { case ButtonPress : HeTbMemoPointer (&info_tb, hev); break; case MotionNotify : switch (hev->sb) { case 1 : HeTbEventRotations(&info_tb, hn, hev); HePostRepaint(hn); break; case 2 : HeTbEventFovy (&info_tb, hn, hev); HePostRepaint(hn); break; case 3 : HeTbEventZdist (&info_tb, hn, hev); HePostRepaint(hn); break; } break; } } 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, "Demo du trackball"); 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); HeSetGLAreaEventProc (glarea, glarea_event_proc); HeFit (princ); return HeMainLoop (princ); }