int main(int argc, char** argv) { /* default values */ char * filename = "teapot.obj"; char * diffuse = "wood.rgba"; char * sphere = "nvidia.rgba"; int c, index; chdir("/opt/examples"); /* Parse some command-line arguments */ while ((c = getopt(argc, argv, "d:e:h:s:")) != -1) { switch (c) { case 'd': diffuse = optarg; break; case 'e': sphere = optarg; break; case 's': /* Set scale */ scale = atof(optarg); break; case 'h': cam_offset = atof(optarg); break; default: /* Uh, that's it for -args */ printf("Unrecognized argument!\n"); break; } } /* Get an optional filename from the last non-- parameter */ for (index = optind; index < argc; ++index) { filename = argv[index]; } printf("Press q to exit.\n"); yctx = yutani_init(); wina = yutani_window_create(yctx, 500, 500); yutani_window_move(yctx, wina, 100, 100); ctx = init_graphics_yutani_double_buffer(wina); draw_fill(ctx, rgb(0,0,0)); yutani_window_update_shape(yctx, wina, YUTANI_SHAPE_THRESHOLD_HALF); yutani_window_advertise_icon(yctx, wina, "GL Teapot", "teapot"); OSMesaContext gl_ctx = OSMesaCreateContext(OSMESA_BGRA, NULL); if (resize(ctx, gl_ctx)) { fprintf(stderr, "%s: Something bad happened.\n", argv[0]); goto finish; } /* Load up the file, set everything else up */ init (filename, diffuse, sphere); /* XXX add a method to query if there are available packets in pex */ pthread_t thread; pthread_create(&thread, NULL, draw_thread, NULL); while (!quit) { yutani_msg_t * m = yutani_poll(yctx); if (m) { switch (m->type) { case YUTANI_MSG_KEY_EVENT: { struct yutani_msg_key_event * ke = (void*)m->data; if (ke->event.action == KEY_ACTION_DOWN) { keyboard(ke->event.keycode, 0, 0); } } break; case YUTANI_MSG_WINDOW_MOUSE_EVENT: { struct yutani_msg_window_mouse_event * me = (void*)m->data; if (me->command == YUTANI_MOUSE_EVENT_DOWN && me->buttons & YUTANI_MOUSE_BUTTON_LEFT) { yutani_window_drag_start(yctx, wina); } } break; case YUTANI_MSG_SESSION_END: quit = 1; break; default: break; } free(m); } } finish: OSMesaDestroyContext(gl_ctx); yutani_close(yctx, wina); return 0; }
int main (int argc, char ** argv) { yutani_t * yctx; yutani_window_t * wina; gfx_context_t * ctx; int should_exit = 0; int blur = 0; int stopped = 0; int left = 30; int top = 30; int width = 500; int height = 500; yctx = yutani_init(); wina = yutani_window_create(yctx, width, height); yutani_window_move(yctx, wina, left, top); ctx = init_graphics_yutani_double_buffer(wina); draw_fill(ctx, rgb(0,0,0)); yutani_window_update_shape(yctx, wina, YUTANI_SHAPE_THRESHOLD_HALF); yutani_window_advertise_icon(yctx, wina, "Mesa Gears", "gears"); OSMesaContext gl_ctx = OSMesaCreateContext(OSMESA_BGRA, NULL); if (resize(ctx, gl_ctx)) { fprintf(stderr, "%s: Something bad happened.\n", argv[0]); goto finish; } init(); while (!should_exit) { yutani_msg_t * m = yutani_poll_async(yctx); if (m) { switch (m->type) { case YUTANI_MSG_KEY_EVENT: { struct yutani_msg_key_event * ke = (void*)m->data; if (ke->event.action == KEY_ACTION_DOWN) { switch (ke->event.keycode) { case 'q': should_exit = 1; free(m); goto finish; case 'b': blur = (1-blur); break; case 's': stopped = (1-stopped); break; case KEY_ARROW_LEFT: view_roty += 5.0; break; case KEY_ARROW_RIGHT: view_roty -= 5.0; break; case KEY_ARROW_UP: view_rotx += 5.0; break; case KEY_ARROW_DOWN: view_rotx -= 5.0; break; default: break; } } } break; case YUTANI_MSG_WINDOW_MOUSE_EVENT: { struct yutani_msg_window_mouse_event * me = (void*)m->data; if (me->command == YUTANI_MOUSE_EVENT_DOWN && me->buttons & YUTANI_MOUSE_BUTTON_LEFT) { yutani_window_drag_start(yctx, wina); } } break; case YUTANI_MSG_SESSION_END: should_exit = 1; break; case YUTANI_MSG_RESIZE_OFFER: { struct yutani_msg_window_resize * wr = (void*)m->data; yutani_window_resize_accept(yctx, wina, wr->width, wr->height); reinit_graphics_yutani(ctx, wina); resize(ctx, gl_ctx); draw(); yutani_window_resize_done(yctx, wina); flip(ctx); yutani_flip(yctx, wina); yutani_window_update_shape(yctx, wina, 1); /* Reset statistics */ frames = 0; start_time = 0; } default: break; } free(m); } fps(); if (!stopped) { angle += 0.2; } draw(); if (blur) { blur_context_box(ctx, 20); } flip(ctx); yutani_flip(yctx, wina); syscall_yield(); } finish: OSMesaDestroyContext(gl_ctx); yutani_close(yctx, wina); return 0; }