void TestGLCanvas::LoadLWO(const wxString &filename) { /* test if lightwave object */ if (!lw_is_lwobject(filename.mb_str())) return; /* read lightwave object */ lwObject *lwobject = lw_object_read(filename.mb_str()); /* scale */ lw_object_scale(lwobject, 10.0 / lw_object_radius(lwobject)); /* set up mesh info */ info.do_init = true; info.lwobject = lwobject; info.beginx = 0.0f; info.beginy = 0.0f; info.zoom = 45.0f; trackball( info.quat, 0.0f, 0.0f, 0.0f, 0.0f ); }
static gint show_lwobject(const char *lwobject_name) { GtkWidget *window, *frame, *glarea; mesh_info *info; lwObject *lwobject; /* read lightwave object */ if (!lw_is_lwobject(lwobject_name)) { g_print("%s is not a LightWave 3D object\n", lwobject_name); return FALSE; } lwobject = lw_object_read(lwobject_name); if (lwobject == NULL) { g_print("Can't read LightWave 3D object %s\n", lwobject_name); return FALSE; } lw_object_scale(lwobject, 10.0 / lw_object_radius(lwobject)); /* create aspect frame */ frame = gtk_aspect_frame_new(NULL, 0.5,0.5, VIEW_ASPECT, FALSE); /* create new OpenGL widget */ glarea = gtk_drawing_area_new(); if (glarea == NULL) { lw_object_free(lwobject); g_print("Can't create GtkDrawingArea widget\n"); return FALSE; } /* Set OpenGL-capability to the widget. */ gtk_widget_set_gl_capability(GTK_WIDGET (glarea), glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE); /* set up events and signals for OpenGL widget */ gtk_widget_set_events(glarea, GDK_EXPOSURE_MASK| GDK_BUTTON_PRESS_MASK| GDK_BUTTON_RELEASE_MASK| GDK_POINTER_MOTION_MASK| GDK_POINTER_MOTION_HINT_MASK); g_signal_connect(G_OBJECT(glarea), "draw", G_CALLBACK(draw), NULL); g_signal_connect(G_OBJECT(glarea), "motion_notify_event", G_CALLBACK(motion_notify), NULL); g_signal_connect(G_OBJECT(glarea), "button_press_event", G_CALLBACK(button_press), NULL); g_signal_connect(G_OBJECT(glarea), "button_release_event", G_CALLBACK(button_release), NULL); g_signal_connect(G_OBJECT(glarea), "configure_event", G_CALLBACK(configure), NULL); g_signal_connect(G_OBJECT (glarea), "map_event", G_CALLBACK (map_event), NULL); g_signal_connect(G_OBJECT (glarea), "unmap_event", G_CALLBACK (unmap_event), NULL); g_signal_connect(G_OBJECT (glarea), "visibility_notify_event", G_CALLBACK (visibility_notify_event), NULL); g_signal_connect(G_OBJECT(glarea), "destroy", G_CALLBACK(destroy), NULL); gtk_widget_set_size_request(glarea, 200,200/VIEW_ASPECT); /* minimum size */ /* set up mesh info */ info = (mesh_info*)g_malloc(sizeof(mesh_info)); info->do_init = TRUE; info->lwobject = lwobject; info->beginx = 0; info->beginy = 0; info->dx = 0; info->dy = 0; info->quat[0] = 0; info->quat[1] = 0; info->quat[2] = 0; info->quat[3] = 1; info->dquat[0] = 0; info->dquat[1] = 0; info->dquat[2] = 0; info->dquat[3] = 1; info->zoom = 45; info->animate = FALSE; info->timeout_id = 0; trackball(info->quat , 0.0, 0.0, 0.0, 0.0); g_object_set_data(G_OBJECT(glarea), "mesh_info", info); /* create new top level window */ window = gtk_window_new( GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), lwobject_name); gtk_container_set_border_width(GTK_CONTAINER(window), 10); gtk_container_set_reallocate_redraws(GTK_CONTAINER (window), TRUE); create_popup_menu(window); /* add popup menu to window */ /* key_press_event handler for top-level window */ g_signal_connect_swapped(G_OBJECT (window), "key_press_event", G_CALLBACK (key_press_event), glarea); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(window_destroy), NULL); window_count++; /* put glarea into window and show it all */ gtk_container_add(GTK_CONTAINER(window), frame); gtk_container_add(GTK_CONTAINER(frame),glarea); gtk_widget_show(glarea); gtk_widget_show(frame); gtk_widget_show(window); return TRUE; }