nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: nuclear@0: static void disp(void); nuclear@0: static void draw_text(void); nuclear@0: static void reshape(int x, int y); nuclear@0: nuclear@0: static struct img_pixmap *curfrm; nuclear@0: static int nfrm; nuclear@0: static int xsz = -1, ysz; nuclear@0: static float tsec; nuclear@0: nuclear@0: static struct dsys_demo *script; nuclear@0: nuclear@0: static struct dtx_font *font; nuclear@0: nuclear@0: static struct { nuclear@0: const char *name, *caption; nuclear@0: struct dsys_event *ev; nuclear@0: } events[] = { nuclear@0: {"diffuse", "diffuse only - 1 light", 0}, nuclear@0: {"diffuse2", "diffuse only - 2 lights", 0}, nuclear@0: {"vmanip", "vertex manipulation", 0}, nuclear@0: {"2tone", "two-tone paint", 0}, nuclear@0: {"specular2", "full phong - 2 lights", 0}, nuclear@0: {"celshade", "cel shading", 0}, nuclear@0: {"sphmap", "reflection - spherical env. map", 0}, nuclear@0: {"cubemap", "reflection - cubic env. map", 0}, nuclear@0: {"refract", "relfection & refraction - cubic env. map w/fresnel", 0}, nuclear@0: {"distort1", "image distortion", 0}, nuclear@0: {"blur", "blur", 0}, nuclear@0: {"distort2", "image distortion (again)", 0}, nuclear@0: {0, 0, 0} nuclear@0: }; nuclear@0: nuclear@0: nuclear@0: int init(void) nuclear@0: { nuclear@0: int i, argc = 1; nuclear@0: char *argv[] = {"./vpost", 0}; nuclear@0: nuclear@0: if(!(font = dtx_open_font("linux-libertine.ttf", 32))) { nuclear@0: fprintf(stderr, "failed to open font\n"); nuclear@0: return -1; nuclear@0: } nuclear@0: nuclear@0: if(!(script = dsys_open("script"))) { nuclear@0: fprintf(stderr, "failed to open script\n"); nuclear@0: return -1; nuclear@0: } nuclear@0: nuclear@0: for(i=0; events[i].name; i++) { nuclear@0: events[i].ev = dsys_event(script, events[i].name); nuclear@0: } nuclear@0: nuclear@0: glutInit(&argc, argv); nuclear@0: glutInitWindowSize(32, 32); nuclear@0: glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); nuclear@0: nuclear@0: glutCreateWindow("foo"); nuclear@0: nuclear@0: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); nuclear@0: nuclear@0: glutDisplayFunc(disp); nuclear@0: glutReshapeFunc(reshape); nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: void shutdown(void) nuclear@0: { nuclear@0: printf("shutdown called\n"); nuclear@0: } nuclear@0: nuclear@0: int process(struct img_pixmap *frame, int frm_num, float sec) nuclear@0: { nuclear@0: curfrm = frame; nuclear@0: nfrm = frm_num; nuclear@0: tsec = sec; nuclear@0: nuclear@0: if(frame->width != xsz || frame->height != ysz) { nuclear@0: glutReshapeWindow(frame->width, frame->height); nuclear@0: } nuclear@0: glutPostRedisplay(); nuclear@0: nuclear@0: while(curfrm) { nuclear@0: glutMainLoopEvent(); nuclear@0: } nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: static void disp(void) nuclear@0: { nuclear@0: assert(curfrm); nuclear@0: glClear(GL_COLOR_BUFFER_BIT); nuclear@0: nuclear@0: dsys_update(script, dsys_msec_to_dtime(nfrm)); nuclear@0: nuclear@0: glDrawPixels(xsz, ysz, GL_RGB, GL_UNSIGNED_BYTE, curfrm->pixels); nuclear@0: nuclear@0: draw_text(); nuclear@0: nuclear@0: glFlush(); nuclear@0: glReadPixels(0, 0, xsz, ysz, GL_RGB, GL_UNSIGNED_BYTE, curfrm->pixels); nuclear@0: nuclear@0: glutSwapBuffers(); nuclear@0: curfrm = 0; nuclear@0: nuclear@0: assert(glGetError() == GL_NO_ERROR); nuclear@0: } nuclear@0: nuclear@0: static float fade(float x) nuclear@0: { nuclear@0: x = 1.0 - (cos((x) * M_PI * 2.0) * 0.5 + 0.5); nuclear@0: x *= 10.0f; nuclear@0: nuclear@0: return x > 1.0 ? 1.0 : x; nuclear@0: } nuclear@0: nuclear@0: static void caption(const char *text, struct dsys_event *ev) nuclear@0: { nuclear@0: float t = fade(dsys_event_value(ev)); nuclear@0: nuclear@0: if(t < (1.0f / 255.0f)) { nuclear@0: return; nuclear@0: } nuclear@0: nuclear@0: glMatrixMode(GL_MODELVIEW); nuclear@0: glPushMatrix(); nuclear@0: glTranslatef(0, 40 * t - 20, 0); nuclear@0: nuclear@0: glBegin(GL_QUADS); nuclear@0: glColor4f(0.7, 0.2, 0.1, t); nuclear@0: glVertex2f(0, -10); nuclear@0: glVertex2f(xsz, -10); nuclear@0: glVertex2f(xsz, 30); nuclear@0: glVertex2f(0, 30); nuclear@0: glEnd(); nuclear@0: nuclear@0: glTranslatef(20, 0, 0); nuclear@0: nuclear@0: glColor4f(1, 1, 1, t); nuclear@0: dtx_string(text); nuclear@0: nuclear@0: glPopMatrix(); nuclear@0: } nuclear@0: nuclear@0: nuclear@0: static void draw_text(void) nuclear@0: { nuclear@0: int i; nuclear@0: dtx_use_font(font, 32); nuclear@0: nuclear@0: glPushAttrib(GL_ENABLE_BIT); nuclear@0: glEnable(GL_BLEND); nuclear@0: nuclear@0: for(i=0; events[i].name; i++) { nuclear@0: caption(events[i].caption, events[i].ev); nuclear@0: } nuclear@0: nuclear@0: glPopAttrib(); nuclear@0: } nuclear@0: nuclear@0: static void reshape(int x, int y) nuclear@0: { nuclear@0: xsz = x; nuclear@0: ysz = y; nuclear@0: nuclear@0: glViewport(0, 0, x, y); nuclear@0: glMatrixMode(GL_PROJECTION); nuclear@0: glLoadIdentity(); nuclear@0: glOrtho(0, x, y, 0, -1, 1); nuclear@0: }