Ignore:
Timestamp:
Sep 16, 2006, 5:06:09 PM (13 years ago)
Author:
Sam Hocevar
Message:
  • Moved the matrix effect test into cacademo. Removed the motion sensor stuff, it's cool but it's crap.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/src/cacademo.c

    r1027 r1030  
    3535void metaballs(enum action, cucul_canvas_t *);
    3636void moire(enum action, cucul_canvas_t *);
     37void langton(enum action, cucul_canvas_t *);
     38void matrix(enum action, cucul_canvas_t *);
    3739
    3840void (*demo_list[])(enum action, cucul_canvas_t *) =
     
    4143    metaballs,
    4244    moire,
     45    //langton,
     46    matrix,
    4347};
     48#define DEMOS (sizeof(demo_list)/sizeof(*demo_list))
    4449
    4550/* Common macros for dither-based demos */
     
    7277    caca_set_display_time(dp, 20000);
    7378
    74     demo = cucul_rand(0, 3);
    75 
    76     demo_list[demo](INIT, NULL);
     79    demo = cucul_rand(0, DEMOS);
     80
     81    demo_list[demo](INIT, frontcv);
    7782
    7883    for(;;)
     
    9196            goto paused;
    9297
    93         demo_list[demo](UPDATE, NULL);
     98        demo_list[demo](UPDATE, frontcv);
    9499        frame++;
    95100paused:
     
    102107    }
    103108end:
    104     demo_list[demo](FREE, NULL);
     109    demo_list[demo](FREE, frontcv);
    105110
    106111    caca_free_display(dp);
     
    179184                  (1.0 + sin(((double)frame) * R[5])) / 2);
    180185        break;
     186
    181187    case DRAW:
    182188        cucul_dither_bitmap(cv, 0, 0,
     
    185191                            dither, screen);
    186192        break;
     193
    187194    case FREE:
    188195        free(screen);
     
    482489}
    483490
     491/* Langton ant effect */
     492#define ANTS 15
     493#define ITER 2
     494
     495void langton(enum action action, cucul_canvas_t *cv)
     496{
     497    static char gradient[] =
     498    {
     499        ' ', ' ', '.', '.', ':', ':', 'x', 'x',
     500        'X', 'X', '&', '&', 'W', 'W', '@', '@',
     501    };
     502    static int steps[][2] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };
     503    static uint8_t *screen;
     504    static int width, height;
     505    static int ax[ANTS], ay[ANTS], dir[ANTS];
     506
     507    int i, a, x, y;
     508
     509    switch(action)
     510    {
     511    case INIT:
     512        width = cucul_get_canvas_width(cv);
     513        height = cucul_get_canvas_height(cv);
     514        screen = malloc(width * height);
     515        memset(screen, 0, width * height);
     516        for(i = 0; i < ANTS; i++)
     517        {
     518            ax[i] = cucul_rand(0, width);
     519            ay[i] = cucul_rand(0, height);
     520            dir[i] = cucul_rand(0, 4);
     521        }
     522        break;
     523
     524    case UPDATE:
     525        for(i = 0; i < ITER; i++)
     526        {
     527            for(x = 0; x < width * height; x++)
     528            {
     529                uint8_t p = screen[x];
     530                if((p & 0x0f) > 1)
     531                    screen[x] = p - 1;
     532            }
     533
     534            for(a = 0; a < ANTS; a++)
     535            {
     536                uint8_t p = screen[ax[a] + width * ay[a]];
     537
     538                if(p & 0x0f)
     539                {
     540                    dir[a] = (dir[a] + 1) % 4;
     541                    screen[ax[a] + width * ay[a]] = a << 4;
     542                }
     543                else
     544                {
     545                    dir[a] = (dir[a] + 3) % 4;
     546                    screen[ax[a] + width * ay[a]] = (a << 4) | 0x0f;
     547                }
     548                ax[a] = (width + ax[a] + steps[dir[a]][0]) % width;
     549                ay[a] = (height + ay[a] + steps[dir[a]][1]) % height;
     550            }
     551        }
     552        break;
     553
     554    case DRAW:
     555        for(y = 0; y < height; y++)
     556        {
     557            for(x = 0; x < width; x++)
     558            {
     559                uint8_t p = screen[x + width * y];
     560
     561                if(p & 0x0f)
     562                    cucul_set_color(cv, CUCUL_COLOR_WHITE, p >> 4);
     563                else
     564                    cucul_set_color(cv, CUCUL_COLOR_BLACK, CUCUL_COLOR_BLACK);
     565                cucul_putchar(cv, x, y, gradient[p & 0x0f]);
     566            }
     567        }
     568        break;
     569
     570    case FREE:
     571        free(screen);
     572        break;
     573    }
     574}
     575
     576/* Matrix effect */
     577#define MAXDROPS 500
     578#define MINLEN 15
     579#define MAXLEN 30
     580
     581struct drop
     582{
     583    int x, y, speed, len;
     584    char str[MAXLEN];
     585}
     586drop[MAXDROPS];
     587
     588void matrix(enum action action, cucul_canvas_t *cv)
     589{
     590    static int w, h;
     591
     592    int i, j;
     593
     594    switch(action)
     595    {
     596    case INIT:
     597        for(i = 0; i < MAXDROPS; i++)
     598        {
     599            drop[i].x = cucul_rand(0, 1000);
     600            drop[i].y = cucul_rand(0, 1000);
     601            drop[i].speed = 5 + cucul_rand(0, 30);
     602            drop[i].len = MINLEN + cucul_rand(0, (MAXLEN - MINLEN));
     603            for(j = 0; j < MAXLEN; j++)
     604                drop[i].str[j] = cucul_rand('0', 'z');
     605        }
     606        break;
     607
     608    case UPDATE:
     609        w = cucul_get_canvas_width(cv);
     610        h = cucul_get_canvas_height(cv);
     611
     612        for(i = 0; i < MAXDROPS && i < (w * h / 32); i++)
     613        {
     614            drop[i].y += drop[i].speed;
     615            if(drop[i].y > 1000)
     616            {
     617                drop[i].y -= 1000;
     618                drop[i].x = cucul_rand(0, 1000);
     619            }
     620        }
     621        break;
     622
     623    case DRAW:
     624        cucul_set_color(cv, CUCUL_COLOR_BLACK, CUCUL_COLOR_BLACK);
     625        cucul_clear_canvas(cv);
     626
     627        for(i = 0; i < MAXDROPS && i < (w * h / 32); i++)
     628        {
     629            int x, y;
     630
     631            x = drop[i].x * w / 1000 / 2 * 2;
     632            y = drop[i].y * (h + MAXLEN) / 1000;
     633
     634            for(j = 0; j < drop[i].len; j++)
     635            {
     636                unsigned int fg;
     637
     638                if(j < 2)
     639                    fg = CUCUL_COLOR_WHITE;
     640                else if(j < drop[i].len / 4)
     641                    fg = CUCUL_COLOR_LIGHTGREEN;
     642                else if(j < drop[i].len * 4 / 5)
     643                    fg = CUCUL_COLOR_GREEN;
     644                else
     645                    fg = CUCUL_COLOR_DARKGRAY;
     646                cucul_set_color(cv, fg, CUCUL_COLOR_BLACK);
     647
     648                cucul_putchar(cv, x, y - j,
     649                              drop[i].str[(y - j) % drop[i].len]);
     650            }
     651        }
     652        break;
     653
     654    case FREE:
     655        break;
     656    }
     657}
     658
     659
Note: See TracChangeset for help on using the changeset viewer.