/* * Original program: * * gtkglarea-1.2.1/examples/viewlw.c * Copyright (C) 1998 Janne Löf * * Conversion to Helium by Edouard.Thiel@lif.univ-mrs.fr */ #include #include "lw.h" He_node *princ, *panel, *mess, *b_quit, *text, *glarea; He_trackball info_tb; lwObject *ze_lwobject = NULL; /* lightwave object mesh */ int load_lwobject(char *lwobject_name); void glarea_init (He_node *hn) { GLfloat light0_pos[4] = { -50.0, 50.0, 0.0, 0.0 }; GLfloat light0_color[4] = { .6, .6, .6, 1.0 }; /* white light */ GLfloat light1_pos[4] = { 50.0, 50.0, 0.0, 0.0 }; GLfloat light1_color[4] = { .4, .4, 1, 1.0 }; /* cold blue light */ /* remove back faces */ glDisable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); /* speedups */ glEnable(GL_DITHER); glShadeModel(GL_SMOOTH); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST); /* light */ glLightfv(GL_LIGHT0, GL_POSITION, light0_pos); glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_color); glLightfv(GL_LIGHT1, GL_POSITION, light1_pos); glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_color); glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); glEnable(GL_LIGHTING); glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); } void glarea_repaint (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 (bleu opaque) et du Zbuffer */ glClearColor(.3,.4,.6,1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* On charge l'objet */ lw_object_show(ze_lwobject); } int test_lecture (char *name) { FILE *f = fopen(name, "rb"); if (f) { fclose(f); return TRUE; } return FALSE; } void dialog_error (char *message, char *filename) { HeSimpleDialog ( HE_DIALOG_BELL, HE_DIALOG_TITLE, "WARNING", HE_DIALOG_MESSAGE, message, HE_DIALOG_QUOTED, filename, HE_DIALOG_BUTTOK, "OK", 0); } int load_lwobject(char *lwobject_name) { lwObject *lwobject; /* read lightwave object */ if (!test_lecture(lwobject_name)) { dialog_error ("Can't open file", lwobject_name); return FALSE; } if (!lw_is_lwobject(lwobject_name)) { dialog_error ("This is not a LightWave 3D object", lwobject_name); return FALSE; } lwobject = lw_object_read(lwobject_name); if (lwobject == NULL) { dialog_error ("Can't read LightWave 3D object", lwobject_name); return FALSE; } lw_object_scale(lwobject, 10.0 / lw_object_radius(lwobject)); /* set up ze_lwobject and init trackball */ lw_object_free(ze_lwobject); ze_lwobject = lwobject; HeTbInitRotations(&info_tb); HeTbInitFovy(&info_tb, 45, 5, 120); HeTbInitZdist(&info_tb, 30, 10, 50); return TRUE; } void glarea_event (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; } } void text_notify_proc (He_node *hn) { char *name = HeGetTextValue (hn); /* charge le fichier */ if (load_lwobject (name)); HePostRepaint (glarea); } void princ_resize (He_node *hn, int width, int height) { int wmin = HeGetWidth(mess) + HeGetWidth (b_quit) + 100; if (width < wmin) { HeSetWidth (hn, wmin); } else { HeSetWidth (panel, width); HeJustify (b_quit, NULL, HE_RIGHT); HeExpand (text, b_quit, HE_RIGHT); HeExpand (glarea, NULL, HE_BOTTOM_RIGHT); } HeFlushDisplay(); } void butt_proc (He_node *hn) { char *name = HeGetButtonLabel (hn); if (strcmp (name, "Quit") == 0) HeQuit(0); } int main (int argc, char *argv[]) { int attr_list[] = { GLX_RGBA, GLX_DOUBLEBUFFER, GLX_DEPTH_SIZE, 1, None }; HeInit (&argc, &argv); if (argc != 2) { printf ("USAGE: %s [options] file.lwo\n", he_base_name); printf ("Type \"%s -help\" to get options\n", he_base_name); HeQuit (1); } princ = HeCreateFrame(); HeSetFrameLabel (princ, "View LightWave 3D objects"); HeSetFrameResizeProc (princ, princ_resize); panel = HeCreatePanel (princ); mess = HeCreateMessageP (panel, "File:", TRUE); text = HeCreateText (panel); HeSetTextNotifyProc (text, text_notify_proc); HeSetTextCompletion (text, TRUE); HeSetWidth (text, 20); HeSetTextValue (text, argv[1]); b_quit = HeCreateButtonP (panel, "Quit", butt_proc, NULL); HeFit (panel); glarea = HeCreateGLArea (princ, attr_list, NULL); HeSetY (glarea, HeGetHeight(panel)+2); HeSetWidth (glarea, 300); HeSetHeight (glarea, 300); HeSetGLAreaInitProc (glarea, glarea_init); HeSetGLAreaRepaintProc (glarea, glarea_repaint); HeSetGLAreaEventProc (glarea, glarea_event); load_lwobject(HeGetTextValue(text)); HeSetTip (glarea, "Bouton 1 : rotations\n" "Bouton 2 : angle de vue\n" "Bouton 3 : distance" ); HeFit (princ); return HeMainLoop (princ); }