dsys2

annotate test.c @ 8:4ad7a01c4ff5

ha
author John Tsiombikas <nuclear@siggraph.org>
date Fri, 02 Sep 2011 10:48:24 +0300
parents 3258d163cfbc
children 66d4fe7a8613
rev   line source
nuclear@2 1 #include <stdio.h>
nuclear@2 2 #include <stdlib.h>
nuclear@8 3 #include <math.h>
nuclear@2 4 #include <time.h>
nuclear@2 5 #include <sys/time.h>
nuclear@2 6
nuclear@2 7 #ifndef __APPLE__
nuclear@2 8 #include <GL/glut.h>
nuclear@2 9 #else
nuclear@2 10 #include <GLUT/glut.h>
nuclear@2 11 #endif
nuclear@2 12
nuclear@2 13 #include "dsys2.h"
nuclear@2 14
nuclear@2 15 void disp(void);
nuclear@7 16 void draw_progress(float p);
nuclear@2 17 void draw_teapot(float sec);
nuclear@8 18 void flash_callback(struct dsys_event *ev, void *cls);
nuclear@2 19 void reshape(int x, int y);
nuclear@2 20 void keyb(unsigned char key, int x, int y);
nuclear@7 21 void skeyb(int key, int x, int y);
nuclear@2 22 unsigned int get_ticks(void);
nuclear@2 23
nuclear@2 24 struct dsys_demo *demo;
nuclear@2 25
nuclear@8 26 struct dsys_event *evfoo, *evfoolong, *evfooshort;
nuclear@8 27
nuclear@8 28 float teapot_color[][4] = {
nuclear@8 29 {0.9, 0.5, 0.3, 1.0},
nuclear@8 30 {0.3, 0.4, 0.8, 1.0}
nuclear@8 31 };
nuclear@8 32
nuclear@2 33 int main(int argc, char **argv)
nuclear@2 34 {
nuclear@2 35 float lpos[] = {-100, 100, 100, 1};
nuclear@2 36
nuclear@2 37 glutInit(&argc, argv);
nuclear@2 38 glutInitWindowSize(800, 600);
nuclear@2 39 glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
nuclear@7 40 glutCreateWindow("dsys test");
nuclear@2 41
nuclear@2 42 glutDisplayFunc(disp);
nuclear@2 43 glutReshapeFunc(reshape);
nuclear@2 44 glutKeyboardFunc(keyb);
nuclear@7 45 glutSpecialFunc(skeyb);
nuclear@2 46 glutIdleFunc(glutPostRedisplay);
nuclear@2 47
nuclear@2 48 glEnable(GL_LIGHTING);
nuclear@2 49 glEnable(GL_LIGHT0);
nuclear@2 50 glLightfv(GL_LIGHT0, GL_POSITION, lpos);
nuclear@2 51
nuclear@2 52 glEnable(GL_CULL_FACE);
nuclear@2 53 glEnable(GL_DEPTH_TEST);
nuclear@2 54
nuclear@7 55 if(!(demo = dsys_open("testscript.dsys"))) {
nuclear@2 56 return 1;
nuclear@2 57 }
nuclear@2 58
nuclear@8 59 evfoo = dsys_event(demo, "foo");
nuclear@8 60 evfoolong = dsys_event(demo, "foolong");
nuclear@8 61 evfooshort = dsys_event(demo, "fooshort");
nuclear@8 62
nuclear@8 63 dsys_event_callback(evfooshort, flash_callback, 0);
nuclear@8 64
nuclear@2 65 glutMainLoop();
nuclear@2 66 return 0;
nuclear@2 67 }
nuclear@2 68
nuclear@2 69
nuclear@2 70 void disp(void)
nuclear@2 71 {
nuclear@8 72 int i;
nuclear@2 73 float sec;
nuclear@8 74 static const float trans[][2] = {{-3, 0}, {3, 0}, {0, -3}, {0, 3}};
nuclear@2 75
nuclear@2 76 dsys_update(demo, dsys_msec_to_dtime(get_ticks()));
nuclear@2 77 sec = dsys_dtime_to_sec(dsys_time(demo));
nuclear@2 78
nuclear@2 79 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
nuclear@2 80
nuclear@2 81 glMatrixMode(GL_MODELVIEW);
nuclear@2 82 glLoadIdentity();
nuclear@2 83 glTranslatef(0, 0, -8);
nuclear@2 84 glRotatef(30.0, 1, 0, 0);
nuclear@2 85
nuclear@2 86 draw_teapot(sec);
nuclear@2 87
nuclear@8 88 glEnable(GL_BLEND);
nuclear@8 89 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
nuclear@8 90
nuclear@8 91 for(i=0; i<4; i++) {
nuclear@8 92 glPushMatrix();
nuclear@8 93 glRotatef(-sec * 100.0, 0, 1, 0);
nuclear@8 94 glTranslatef(trans[i][0], 0, trans[i][1]);
nuclear@8 95 glScalef(0.7, 0.7, 0.7);
nuclear@8 96 draw_teapot(sec);
nuclear@8 97 glPopMatrix();
nuclear@8 98 }
nuclear@8 99 glDisable(GL_BLEND);
nuclear@8 100
nuclear@7 101 draw_progress(dsys_progress(demo));
nuclear@7 102
nuclear@2 103 glutSwapBuffers();
nuclear@2 104 }
nuclear@2 105
nuclear@7 106 void draw_progress(float p)
nuclear@7 107 {
nuclear@7 108 glMatrixMode(GL_MODELVIEW);
nuclear@7 109 glPushMatrix();
nuclear@7 110 glLoadIdentity();
nuclear@7 111 glMatrixMode(GL_PROJECTION);
nuclear@7 112 glPushMatrix();
nuclear@7 113 glLoadIdentity();
nuclear@7 114
nuclear@7 115 glPushAttrib(GL_ENABLE_BIT);
nuclear@7 116 glDisable(GL_LIGHTING);
nuclear@7 117 glDisable(GL_DEPTH_TEST);
nuclear@7 118
nuclear@7 119 glBegin(GL_QUADS);
nuclear@7 120 glColor3f(1, 1, 1);
nuclear@7 121 glVertex2f(-0.5, 0.9);
nuclear@7 122 glVertex2f(0.5, 0.9);
nuclear@7 123 glVertex2f(0.5, 0.98);
nuclear@7 124 glVertex2f(-0.5, 0.98);
nuclear@7 125
nuclear@7 126 glColor3f(0, 0, 0);
nuclear@7 127 glVertex2f(-0.49, 0.91);
nuclear@7 128 glVertex2f(0.49, 0.91);
nuclear@7 129 glVertex2f(0.49, 0.97);
nuclear@7 130 glVertex2f(-0.49, 0.97);
nuclear@7 131
nuclear@7 132 glColor3f(1, 0, 0);
nuclear@7 133 glVertex2f(-0.48, 0.92);
nuclear@7 134 glVertex2f(-0.48 + 2.0 * 0.48 * p, 0.92);
nuclear@7 135 glVertex2f(-0.48 + 2.0 * 0.48 * p, 0.96);
nuclear@7 136 glVertex2f(-0.48, 0.96);
nuclear@7 137 glEnd();
nuclear@7 138
nuclear@7 139 glPopAttrib();
nuclear@7 140
nuclear@7 141 glPopMatrix();
nuclear@7 142 glMatrixMode(GL_MODELVIEW);
nuclear@7 143 glPopMatrix();
nuclear@7 144 }
nuclear@7 145
nuclear@8 146 #define LERP(a, b, t) ((a) + ((b) - (a)) * (t))
nuclear@8 147
nuclear@2 148 void draw_teapot(float sec)
nuclear@2 149 {
nuclear@8 150 float dcol[4];
nuclear@2 151 float scol[] = {0.8, 0.8, 0.8, 1.0};
nuclear@8 152 float t = dsys_event_value(evfoo);
nuclear@8 153
nuclear@8 154 dcol[0] = LERP(teapot_color[0][0], teapot_color[1][0], t);
nuclear@8 155 dcol[1] = LERP(teapot_color[0][1], teapot_color[1][1], t);
nuclear@8 156 dcol[2] = LERP(teapot_color[0][2], teapot_color[1][2], t);
nuclear@8 157 dcol[3] = dsys_event_value(evfoolong);
nuclear@2 158
nuclear@2 159 glPushMatrix();
nuclear@2 160 glRotatef(sec * 100.0, 0, 1, 0);
nuclear@2 161
nuclear@2 162 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, dcol);
nuclear@2 163 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, scol);
nuclear@2 164 glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 60.0);
nuclear@2 165
nuclear@2 166 glFrontFace(GL_CW);
nuclear@2 167 glutSolidTeapot(1.0);
nuclear@2 168 glFrontFace(GL_CCW);
nuclear@2 169
nuclear@2 170 glPopMatrix();
nuclear@2 171 }
nuclear@2 172
nuclear@8 173 void flash_callback(struct dsys_event *ev, void *cls)
nuclear@8 174 {
nuclear@8 175 float t = sin(dsys_event_value(ev) * M_PI);
nuclear@8 176
nuclear@8 177 glClearColor(t, t, t, 1.0);
nuclear@8 178 }
nuclear@8 179
nuclear@2 180 void reshape(int x, int y)
nuclear@2 181 {
nuclear@2 182 glViewport(0, 0, x, y);
nuclear@2 183
nuclear@2 184 glMatrixMode(GL_PROJECTION);
nuclear@2 185 glLoadIdentity();
nuclear@2 186 gluPerspective(45.0, (float)x / (float)y, 1.0, 1000.0);
nuclear@2 187 }
nuclear@2 188
nuclear@2 189 void keyb(unsigned char key, int x, int y)
nuclear@2 190 {
nuclear@2 191 switch(key) {
nuclear@2 192 case 27:
nuclear@2 193 exit(0);
nuclear@2 194
nuclear@2 195 case ' ':
nuclear@2 196 if(dsys_is_running(demo)) {
nuclear@2 197 dsys_stop(demo);
nuclear@2 198 } else {
nuclear@2 199 dsys_start(demo);
nuclear@2 200 }
nuclear@2 201 break;
nuclear@2 202
nuclear@2 203 default:
nuclear@7 204 if(key >= '1' && key <= '9') {
nuclear@7 205 float n = (float)(key - '0') / 10.0;
nuclear@7 206 printf("seek to: %f percent\n", n * 100.0);
nuclear@7 207 dsys_seek_norm(demo, n);
nuclear@7 208 }
nuclear@7 209 break;
nuclear@7 210 }
nuclear@7 211 }
nuclear@7 212
nuclear@7 213 void skeyb(int key, int x, int y)
nuclear@7 214 {
nuclear@7 215 switch(key) {
nuclear@7 216 case GLUT_KEY_LEFT:
nuclear@7 217 dsys_seek(demo, dsys_time(demo) - dsys_sec_to_dtime(5));
nuclear@7 218 break;
nuclear@7 219
nuclear@7 220 case GLUT_KEY_RIGHT:
nuclear@7 221 dsys_seek(demo, dsys_time(demo) + dsys_sec_to_dtime(5));
nuclear@7 222 break;
nuclear@7 223
nuclear@7 224 case GLUT_KEY_UP:
nuclear@7 225 dsys_seek(demo, dsys_time(demo) + dsys_sec_to_dtime(30));
nuclear@7 226 break;
nuclear@7 227
nuclear@7 228 case GLUT_KEY_DOWN:
nuclear@7 229 dsys_seek(demo, dsys_time(demo) - dsys_sec_to_dtime(30));
nuclear@7 230 break;
nuclear@7 231
nuclear@7 232 case GLUT_KEY_PAGE_UP:
nuclear@7 233 dsys_seek(demo, dsys_time(demo) + dsys_sec_to_dtime(5 * 60));
nuclear@7 234 break;
nuclear@7 235
nuclear@7 236 case GLUT_KEY_PAGE_DOWN:
nuclear@7 237 dsys_seek(demo, dsys_time(demo) - dsys_sec_to_dtime(5 * 60));
nuclear@7 238 break;
nuclear@7 239
nuclear@7 240 default:
nuclear@2 241 break;
nuclear@2 242 }
nuclear@2 243 }
nuclear@2 244
nuclear@2 245 unsigned int get_ticks(void)
nuclear@2 246 {
nuclear@2 247 static struct timeval tv0;
nuclear@2 248 struct timeval tv;
nuclear@2 249
nuclear@2 250 gettimeofday(&tv, 0);
nuclear@2 251
nuclear@2 252 if(tv0.tv_sec == 0 && tv0.tv_usec == 0) {
nuclear@2 253 tv0 = tv;
nuclear@2 254 }
nuclear@2 255 return (tv.tv_sec - tv0.tv_sec) * 1000 + (tv.tv_usec - tv0.tv_usec) / 1000;
nuclear@2 256 }