2 #include <GL/freeglut.h>
12 #define BEAM_SHELLS 40
13 #define BEAM_RMIN 0.01
14 #define BEAM_RMAX 0.125
15 #define BEAM_ENERGY 0.02
17 #define BEAM_DEF_SPEED 0.1
20 static void cleanup();
22 static void display();
24 static void backdrop();
27 static void reshape(int x, int y);
28 static void keyboard(unsigned char c, int x, int y);
29 static void mbutton(int bn, int state, int x, int y);
30 static void mmotion(int x, int y);
32 static float cam_theta = 45, cam_phi, cam_dist = 10;
33 static unsigned int sdr_beam, sdr_sky;
34 static long start_time;
35 static long anim_stop_time;
36 static long tmsec, prev_tmsec;
38 static const float sil_color[] = {0.05, 0.02, 0.1, 1.0};
39 static const float beam_color[] = {0.5, 0.4, 0.2, 1.0};
41 static float beam_angle, beam_speed;
43 int main(int argc, char **argv)
45 glutInit(&argc, argv);
46 glutInitWindowSize(800, 600);
47 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH | GLUT_MULTISAMPLE);
49 glutCreateWindow("Faros");
51 glutDisplayFunc(display);
53 glutReshapeFunc(reshape);
54 glutKeyboardFunc(keyboard);
55 glutMouseFunc(mbutton);
56 glutMotionFunc(mmotion);
72 glEnable(GL_CULL_FACE);
73 glEnable(GL_DEPTH_TEST);
74 glEnable(GL_MULTISAMPLE);
76 // glEnable(GL_LIGHTING);
79 glEnable(GL_NORMALIZE);
84 if(!(sdr_beam = create_program_load("sdr/beam.v.glsl", "sdr/beam.f.glsl")))
87 if(!(sdr_sky = create_program_load("sdr/sky.v.glsl", "sdr/sky.f.glsl"))) {
94 add_seq_track("beam-speed", INTERP_SIGMOID, EXTRAP_CLAMP, BEAM_DEF_SPEED);
97 start_time = glutGet(GLUT_ELAPSED_TIME);
98 prev_tmsec = start_time;
102 static void cleanup()
106 free_program(sdr_beam);
107 free_program(sdr_sky);
110 static void display()
112 tmsec = (long)glutGet(GLUT_ELAPSED_TIME) - start_time;
113 float dt = (tmsec - prev_tmsec) / 1000.0f;
116 if(anim_stop_time) dt = 0.0f;
118 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
121 glMatrixMode(GL_MODELVIEW);
124 glTranslatef(0, -2, -cam_dist);
125 glRotatef(cam_phi, 1, 0, 0);
126 glRotatef(cam_theta, 0, 1, 0);
128 glColor3fv(sil_color);
134 beam_speed = get_seq_value("beam-speed", tmsec);
135 beam_angle += beam_speed * 360.0f * dt;
136 glRotatef(beam_angle, 0, 1, 0);
146 glPushAttrib(GL_ENABLE_BIT);
147 glDisable(GL_CULL_FACE);
151 glTranslatef(0, 4.65, 0.2);
152 bind_program(sdr_beam);
153 set_uniform_float(sdr_beam, "beam_len", BEAM_LEN);
156 glBlendFunc(GL_SRC_ALPHA, GL_ONE);
158 for(int i=0; i<BEAM_SHELLS; i++) {
159 float t = (float)i / (float)(BEAM_SHELLS - 1);
160 float rad = BEAM_RMIN + (BEAM_RMAX - BEAM_RMIN) * t;
161 float alpha = BEAM_ENERGY / (t * t);
163 glColor4f(beam_color[0], beam_color[1], beam_color[2], alpha);
165 glutSolidCylinder(rad, BEAM_LEN, 12, 1);
175 static void backdrop()
178 bind_program(sdr_sky);
179 glutSolidSphere(200, 16, 32);
191 static void reshape(int x, int y)
193 glViewport(0, 0, x, y);
195 glMatrixMode(GL_PROJECTION);
198 gluPerspective(50, (float)x / (float)y, 0.5, 500);
201 #define ANIM_DELTA 0.5
203 static void keyboard(unsigned char c, int x, int y)
206 static float orig_beam_speed;
213 start_time = glutGet(GLUT_ELAPSED_TIME);
220 if(anim_stop_time > 0) {
221 long msec = glutGet(GLUT_ELAPSED_TIME);
222 start_time += msec - anim_stop_time;
223 prev_tmsec = msec - start_time;
226 anim_stop_time = glutGet(GLUT_ELAPSED_TIME);
231 beam_speed = get_seq_value("beam-speed", tmsec);
232 clear_seq_track("beam-speed");
233 set_seq_value("beam-speed", tmsec, beam_speed + ANIM_DELTA);
237 beam_speed = get_seq_value("beam-speed", tmsec) - ANIM_DELTA;
240 clear_seq_track("beam-speed");
241 set_seq_value("beam-speed", tmsec, beam_speed);
246 idx = find_seq_track("beam-speed");
248 if(get_seq_value(idx, tmsec) > 0.0) {
249 clear_seq_track(idx);
250 set_seq_value(idx, tmsec, beam_speed);
251 set_seq_value(idx, tmsec + 3000, 0);
252 orig_beam_speed = beam_speed;
254 clear_seq_track(idx);
255 set_seq_value(idx, tmsec, 0);
256 set_seq_value(idx, tmsec + 3000, orig_beam_speed);
261 printf("dumping animation data to: seq_dump\n");
262 if(!dump_seq("seq_dump")) {
263 fprintf(stderr, "dump failed\n");
272 static int prev_x, prev_y;
274 static void mbutton(int bn, int state, int x, int y)
276 int button = bn - GLUT_LEFT_BUTTON;
277 bst[button] = state == GLUT_DOWN;
283 static void mmotion(int x, int y)
291 if (dx == 0 && dy == 0)
295 cam_theta += dx * 0.5;
306 cam_dist += dy * 0.1;