X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=fbgfx;a=blobdiff_plain;f=src%2Ftunnel.c;h=8dec9025dbd58278153963825a6ffd57dfda5619;hp=4707d81a9adb65f712a22265bf463934a6d94412;hb=3a148d92224a9ab88a9c602b072d85d4b1b1eddd;hpb=70c067c2da05fb71f3d2de115cefbc225eff3667 diff --git a/src/tunnel.c b/src/tunnel.c index 4707d81..8dec902 100644 --- a/src/tunnel.c +++ b/src/tunnel.c @@ -20,10 +20,10 @@ static void start(long trans_time); static void stop(long trans_time); static void draw(void); -static void (*draw_tunnel_range)(void*, int, int); +static void (*draw_tunnel_range)(void*, int, int, long); -static void draw_tunnel_range16(void *pixels, int starty, int num_lines); -static void draw_tunnel_range32(void *pixels, int starty, int num_lines); +static void draw_tunnel_range16(void *pixels, int starty, int num_lines, long tm); +static void draw_tunnel_range32(void *pixels, int starty, int num_lines, long tm); static int count_bits(unsigned int x); static int count_zeros(unsigned int x); @@ -47,6 +47,9 @@ static unsigned int tex_xmask, tex_ymask; static struct thread_pool *tpool; +static long trans_start, trans_dur; +static int trans_dir; + struct screen *tunnel_screen(void) { @@ -146,10 +149,16 @@ static void destroy(void) static void start(long trans_time) { + trans_start = time_msec; + trans_dur = trans_time; + trans_dir = 1; } static void stop(long trans_time) { + trans_start = time_msec; + trans_dur = trans_time; + trans_dir = -1; } #define NUM_WORK_ITEMS 32 @@ -157,21 +166,38 @@ static void stop(long trans_time) static struct work { void *pixels; int starty, num_lines; + long tm; } work[NUM_WORK_ITEMS]; static void work_func(void *cls) { struct work *w = (struct work*)cls; - draw_tunnel_range(w->pixels, w->starty, w->num_lines); + draw_tunnel_range(w->pixels, w->starty, w->num_lines, w->tm); } static void draw(void) { int i, num_lines = vysz / NUM_WORK_ITEMS; + int draw_lines = num_lines; + + if(trans_dir) { + long interval = time_msec - trans_start; + int progr = num_lines * interval / trans_dur; + if(trans_dir < 0) { + draw_lines = num_lines - progr - 1; + } else { + draw_lines = progr; + } + if(progr >= num_lines) { + trans_dir = 0; + } + } + for(i=0; i> 1); for(i=0; i