vpost_plugins

annotate hullsdr/hullsdr_post.c @ 0:7f7342bfbb25

vpost plugin for that video: http://www.youtube.com/watch?v=txt6SGL483E
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 19 Oct 2011 06:23:32 +0300
parents
children
rev   line source
nuclear@0 1 #include <math.h>
nuclear@0 2 #include <assert.h>
nuclear@0 3 #include <GL/glut.h>
nuclear@0 4 #include <GL/freeglut_ext.h>
nuclear@0 5 #include <imago2.h>
nuclear@0 6 #include <drawtext.h>
nuclear@0 7 #include <dsys.h>
nuclear@0 8
nuclear@0 9 static void disp(void);
nuclear@0 10 static void draw_text(void);
nuclear@0 11 static void reshape(int x, int y);
nuclear@0 12
nuclear@0 13 static struct img_pixmap *curfrm;
nuclear@0 14 static int nfrm;
nuclear@0 15 static int xsz = -1, ysz;
nuclear@0 16 static float tsec;
nuclear@0 17
nuclear@0 18 static struct dsys_demo *script;
nuclear@0 19
nuclear@0 20 static struct dtx_font *font;
nuclear@0 21
nuclear@0 22 static struct {
nuclear@0 23 const char *name, *caption;
nuclear@0 24 struct dsys_event *ev;
nuclear@0 25 } events[] = {
nuclear@0 26 {"diffuse", "diffuse only - 1 light", 0},
nuclear@0 27 {"diffuse2", "diffuse only - 2 lights", 0},
nuclear@0 28 {"vmanip", "vertex manipulation", 0},
nuclear@0 29 {"2tone", "two-tone paint", 0},
nuclear@0 30 {"specular2", "full phong - 2 lights", 0},
nuclear@0 31 {"celshade", "cel shading", 0},
nuclear@0 32 {"sphmap", "reflection - spherical env. map", 0},
nuclear@0 33 {"cubemap", "reflection - cubic env. map", 0},
nuclear@0 34 {"refract", "relfection & refraction - cubic env. map w/fresnel", 0},
nuclear@0 35 {"distort1", "image distortion", 0},
nuclear@0 36 {"blur", "blur", 0},
nuclear@0 37 {"distort2", "image distortion (again)", 0},
nuclear@0 38 {0, 0, 0}
nuclear@0 39 };
nuclear@0 40
nuclear@0 41
nuclear@0 42 int init(void)
nuclear@0 43 {
nuclear@0 44 int i, argc = 1;
nuclear@0 45 char *argv[] = {"./vpost", 0};
nuclear@0 46
nuclear@0 47 if(!(font = dtx_open_font("linux-libertine.ttf", 32))) {
nuclear@0 48 fprintf(stderr, "failed to open font\n");
nuclear@0 49 return -1;
nuclear@0 50 }
nuclear@0 51
nuclear@0 52 if(!(script = dsys_open("script"))) {
nuclear@0 53 fprintf(stderr, "failed to open script\n");
nuclear@0 54 return -1;
nuclear@0 55 }
nuclear@0 56
nuclear@0 57 for(i=0; events[i].name; i++) {
nuclear@0 58 events[i].ev = dsys_event(script, events[i].name);
nuclear@0 59 }
nuclear@0 60
nuclear@0 61 glutInit(&argc, argv);
nuclear@0 62 glutInitWindowSize(32, 32);
nuclear@0 63 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
nuclear@0 64
nuclear@0 65 glutCreateWindow("foo");
nuclear@0 66
nuclear@0 67 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
nuclear@0 68
nuclear@0 69 glutDisplayFunc(disp);
nuclear@0 70 glutReshapeFunc(reshape);
nuclear@0 71 return 0;
nuclear@0 72 }
nuclear@0 73
nuclear@0 74 void shutdown(void)
nuclear@0 75 {
nuclear@0 76 printf("shutdown called\n");
nuclear@0 77 }
nuclear@0 78
nuclear@0 79 int process(struct img_pixmap *frame, int frm_num, float sec)
nuclear@0 80 {
nuclear@0 81 curfrm = frame;
nuclear@0 82 nfrm = frm_num;
nuclear@0 83 tsec = sec;
nuclear@0 84
nuclear@0 85 if(frame->width != xsz || frame->height != ysz) {
nuclear@0 86 glutReshapeWindow(frame->width, frame->height);
nuclear@0 87 }
nuclear@0 88 glutPostRedisplay();
nuclear@0 89
nuclear@0 90 while(curfrm) {
nuclear@0 91 glutMainLoopEvent();
nuclear@0 92 }
nuclear@0 93 return 0;
nuclear@0 94 }
nuclear@0 95
nuclear@0 96 static void disp(void)
nuclear@0 97 {
nuclear@0 98 assert(curfrm);
nuclear@0 99 glClear(GL_COLOR_BUFFER_BIT);
nuclear@0 100
nuclear@0 101 dsys_update(script, dsys_msec_to_dtime(nfrm));
nuclear@0 102
nuclear@0 103 glDrawPixels(xsz, ysz, GL_RGB, GL_UNSIGNED_BYTE, curfrm->pixels);
nuclear@0 104
nuclear@0 105 draw_text();
nuclear@0 106
nuclear@0 107 glFlush();
nuclear@0 108 glReadPixels(0, 0, xsz, ysz, GL_RGB, GL_UNSIGNED_BYTE, curfrm->pixels);
nuclear@0 109
nuclear@0 110 glutSwapBuffers();
nuclear@0 111 curfrm = 0;
nuclear@0 112
nuclear@0 113 assert(glGetError() == GL_NO_ERROR);
nuclear@0 114 }
nuclear@0 115
nuclear@0 116 static float fade(float x)
nuclear@0 117 {
nuclear@0 118 x = 1.0 - (cos((x) * M_PI * 2.0) * 0.5 + 0.5);
nuclear@0 119 x *= 10.0f;
nuclear@0 120
nuclear@0 121 return x > 1.0 ? 1.0 : x;
nuclear@0 122 }
nuclear@0 123
nuclear@0 124 static void caption(const char *text, struct dsys_event *ev)
nuclear@0 125 {
nuclear@0 126 float t = fade(dsys_event_value(ev));
nuclear@0 127
nuclear@0 128 if(t < (1.0f / 255.0f)) {
nuclear@0 129 return;
nuclear@0 130 }
nuclear@0 131
nuclear@0 132 glMatrixMode(GL_MODELVIEW);
nuclear@0 133 glPushMatrix();
nuclear@0 134 glTranslatef(0, 40 * t - 20, 0);
nuclear@0 135
nuclear@0 136 glBegin(GL_QUADS);
nuclear@0 137 glColor4f(0.7, 0.2, 0.1, t);
nuclear@0 138 glVertex2f(0, -10);
nuclear@0 139 glVertex2f(xsz, -10);
nuclear@0 140 glVertex2f(xsz, 30);
nuclear@0 141 glVertex2f(0, 30);
nuclear@0 142 glEnd();
nuclear@0 143
nuclear@0 144 glTranslatef(20, 0, 0);
nuclear@0 145
nuclear@0 146 glColor4f(1, 1, 1, t);
nuclear@0 147 dtx_string(text);
nuclear@0 148
nuclear@0 149 glPopMatrix();
nuclear@0 150 }
nuclear@0 151
nuclear@0 152
nuclear@0 153 static void draw_text(void)
nuclear@0 154 {
nuclear@0 155 int i;
nuclear@0 156 dtx_use_font(font, 32);
nuclear@0 157
nuclear@0 158 glPushAttrib(GL_ENABLE_BIT);
nuclear@0 159 glEnable(GL_BLEND);
nuclear@0 160
nuclear@0 161 for(i=0; events[i].name; i++) {
nuclear@0 162 caption(events[i].caption, events[i].ev);
nuclear@0 163 }
nuclear@0 164
nuclear@0 165 glPopAttrib();
nuclear@0 166 }
nuclear@0 167
nuclear@0 168 static void reshape(int x, int y)
nuclear@0 169 {
nuclear@0 170 xsz = x;
nuclear@0 171 ysz = y;
nuclear@0 172
nuclear@0 173 glViewport(0, 0, x, y);
nuclear@0 174 glMatrixMode(GL_PROJECTION);
nuclear@0 175 glLoadIdentity();
nuclear@0 176 glOrtho(0, x, y, 0, -1, 1);
nuclear@0 177 }