X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fmain.cc;h=a2164a472ac0be86c2de03733d043076c57fe65f;hb=6917510e2aff5fa6599065c684a344a24e42123d;hp=0284a42cb4cf24ce9422a354cf93c4d997e53689;hpb=b9f859fddd8d2e482a6fbcfe37828b64865a8727;p=lighthouse diff --git a/src/main.cc b/src/main.cc index 0284a42..a2164a4 100644 --- a/src/main.cc +++ b/src/main.cc @@ -24,6 +24,7 @@ static void faros(); static void light(); static void ground(); static void backdrop(); +static void xlogo(); static void display(); static void idle(); @@ -34,8 +35,10 @@ static void mmotion(int x, int y); static float cam_theta = 45, cam_phi, cam_dist = 10; static unsigned int sdr_curve_top, sdr_beam, sdr_sky; -static unsigned int start_time; -static float beam_rot_speed = 0.1; +static long start_time; +static float anim_speed = 1.0; +static long anim_stop_time; +static long tmsec; static const float sil_color[] = {0.05, 0.02, 0.1, 1.0}; static const float beam_color[] = {0.5, 0.4, 0.2, 1.0}; @@ -175,7 +178,7 @@ static void faros() glScalef(1, 1, 0.45); glutSolidCylinder(1, 1, 4, 16); glPopMatrix(); - + bind_program(0); } @@ -234,8 +237,14 @@ static void backdrop() static void display() { - unsigned int tmsec = glutGet(GLUT_ELAPSED_TIME) - start_time; + if(anim_stop_time > 0) { + tmsec = anim_stop_time - start_time; + } else { + tmsec = (long)glutGet(GLUT_ELAPSED_TIME) - start_time; + } + float tsec = (float)tmsec / 1000.0; + float tanim = tsec * anim_speed; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); backdrop(); @@ -252,8 +261,7 @@ static void display() glPushMatrix(); - float beam_angle = tsec * beam_rot_speed * 360; - + float beam_angle = tanim * 0.1 * 360; glRotatef(beam_angle, 0, 1, 0); light(); @@ -277,11 +285,43 @@ static void reshape(int x, int y) gluPerspective(50, (float)x / (float)y, 0.5, 500); } +static long calc_timeshift(float prev_speed, float speed) +{ + long delta = tmsec * speed - tmsec * prev_speed; + return delta / speed; +} + +#define ANIM_DELTA 0.5 + static void keyboard(unsigned char c, int x, int y) { + float prev_anim_speed; + switch(c) { case 27: exit(0); + + case ' ': + if(anim_stop_time > 0) { + start_time += glutGet(GLUT_ELAPSED_TIME) - anim_stop_time; + anim_stop_time = 0; + } else { + anim_stop_time = glutGet(GLUT_ELAPSED_TIME); + } + break; + + case '=': + start_time += calc_timeshift(anim_speed, anim_speed + ANIM_DELTA); + anim_speed += ANIM_DELTA; + break; + + case '-': + prev_anim_speed = anim_speed; + anim_speed -= ANIM_DELTA; + if(anim_speed < 0) + anim_speed = 0; + start_time += calc_timeshift(prev_anim_speed, anim_speed); + break; default: break; }