| @@ -31,6 +31,7 @@ | |||||
| enum action { PREPARE, INIT, UPDATE, RENDER, FREE }; | enum action { PREPARE, INIT, UPDATE, RENDER, FREE }; | ||||
| void do_transition(cucul_canvas_t *mask, int transition, float time); | |||||
| void plasma(enum action, cucul_canvas_t *); | void plasma(enum action, cucul_canvas_t *); | ||||
| void metaballs(enum action, cucul_canvas_t *); | void metaballs(enum action, cucul_canvas_t *); | ||||
| void moire(enum action, cucul_canvas_t *); | void moire(enum action, cucul_canvas_t *); | ||||
| @@ -50,10 +51,32 @@ void (*fn[])(enum action, cucul_canvas_t *) = | |||||
| #define DEMO_FRAMES 1000 | #define DEMO_FRAMES 1000 | ||||
| #define TRANSITION_FRAMES 40 | #define TRANSITION_FRAMES 40 | ||||
| #define TRANSITION_COUNT 2 | |||||
| #define TRANSITION_CIRCLE 0 | |||||
| #define TRANSITION_STAR 1 | |||||
| /* Common macros for dither-based demos */ | /* Common macros for dither-based demos */ | ||||
| #define XSIZ 256 | #define XSIZ 256 | ||||
| #define YSIZ 256 | #define YSIZ 256 | ||||
| #define OFFSET_X(i) (i*2) | |||||
| #define OFFSET_Y(i) (i*2)+1 | |||||
| float star[] = { | |||||
| 0.000000, -1.000000, | |||||
| 0.308000,-0.349000, | |||||
| 0.992000,-0.244000, | |||||
| 0.500000,0.266000, | |||||
| 0.632000,0.998000, | |||||
| 0.008000,0.659000, | |||||
| -0.601000,0.995000, | |||||
| -0.496000,0.275000, | |||||
| -0.997000,-0.244000, | |||||
| -0.313000,-0.349000 | |||||
| }; | |||||
| /* Global variables */ | /* Global variables */ | ||||
| static int frame = 0; | static int frame = 0; | ||||
| @@ -64,6 +87,9 @@ int main(int argc, char **argv) | |||||
| int demo, next = -1, pause = 0, next_transition = DEMO_FRAMES; | int demo, next = -1, pause = 0, next_transition = DEMO_FRAMES; | ||||
| unsigned int i; | unsigned int i; | ||||
| int transition = cucul_rand(0, TRANSITION_COUNT); | |||||
| /* Set up two canvases, a mask, and attach a display to the front one */ | /* Set up two canvases, a mask, and attach a display to the front one */ | ||||
| frontcv = cucul_create_canvas(0, 0); | frontcv = cucul_create_canvas(0, 0); | ||||
| @@ -89,7 +115,7 @@ int main(int argc, char **argv) | |||||
| demo = cucul_rand(0, DEMOS); | demo = cucul_rand(0, DEMOS); | ||||
| fn[demo](INIT, frontcv); | fn[demo](INIT, frontcv); | ||||
| for(;;) | |||||
| for(;;) | |||||
| { | { | ||||
| /* Handle events */ | /* Handle events */ | ||||
| caca_event_t ev; | caca_event_t ev; | ||||
| @@ -129,7 +155,7 @@ int main(int argc, char **argv) | |||||
| if(frame == next_transition) | if(frame == next_transition) | ||||
| { | { | ||||
| next = cucul_rand(0, DEMOS); | next = cucul_rand(0, DEMOS); | ||||
| if(next == demo) | |||||
| if(next == demo) | |||||
| next = (next + 1) % DEMOS; | next = (next + 1) % DEMOS; | ||||
| fn[next](INIT, backcv); | fn[next](INIT, backcv); | ||||
| } | } | ||||
| @@ -156,15 +182,12 @@ paused: | |||||
| cucul_set_color(mask, CUCUL_COLOR_LIGHTGRAY, CUCUL_COLOR_BLACK); | cucul_set_color(mask, CUCUL_COLOR_LIGHTGRAY, CUCUL_COLOR_BLACK); | ||||
| cucul_clear_canvas(mask); | cucul_clear_canvas(mask); | ||||
| cucul_set_color(mask, CUCUL_COLOR_WHITE, CUCUL_COLOR_WHITE); | cucul_set_color(mask, CUCUL_COLOR_WHITE, CUCUL_COLOR_WHITE); | ||||
| cucul_fill_ellipse(mask, | |||||
| cucul_get_canvas_width(mask) / 2, | |||||
| cucul_get_canvas_height(mask) / 2, | |||||
| cucul_get_canvas_width(mask) * | |||||
| (frame - next_transition) / TRANSITION_FRAMES * 3 / 4, | |||||
| cucul_get_canvas_height(mask) * | |||||
| (frame - next_transition) / TRANSITION_FRAMES * 3 / 4, | |||||
| "#"); | |||||
| do_transition(mask, | |||||
| transition, | |||||
| (float)(frame - next_transition) / TRANSITION_FRAMES * 3.0f / 4.0f); | |||||
| cucul_blit(frontcv, 0, 0, backcv, mask); | cucul_blit(frontcv, 0, 0, backcv, mask); | ||||
| } else { | |||||
| transition = cucul_rand(0, TRANSITION_COUNT); | |||||
| } | } | ||||
| cucul_set_color(frontcv, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE); | cucul_set_color(frontcv, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE); | ||||
| @@ -186,6 +209,75 @@ end: | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| /* Transitions */ | |||||
| void do_transition(cucul_canvas_t *mask, int transition, float time) | |||||
| { | |||||
| float mulx = time*cucul_get_canvas_width(mask); | |||||
| float muly = time*cucul_get_canvas_height(mask); | |||||
| int w2 = cucul_get_canvas_width(mask) / 2; | |||||
| int h2 = cucul_get_canvas_height(mask) / 2; | |||||
| switch(transition) | |||||
| { | |||||
| case TRANSITION_STAR: | |||||
| mulx*=1.8; | |||||
| muly*=1.8; | |||||
| cucul_fill_triangle(mask, | |||||
| star[OFFSET_X(0)]*mulx+w2, star[OFFSET_Y(0)]*muly+h2, | |||||
| star[OFFSET_X(1)]*mulx+w2, star[OFFSET_Y(1)]*muly+h2, | |||||
| star[OFFSET_X(9)]*mulx+w2, star[OFFSET_Y(9)]*muly+h2, | |||||
| "#"); | |||||
| cucul_fill_triangle(mask, | |||||
| star[OFFSET_X(1)]*mulx+w2, star[OFFSET_Y(1)]*muly+h2, | |||||
| star[OFFSET_X(2)]*mulx+w2, star[OFFSET_Y(2)]*muly+h2, | |||||
| star[OFFSET_X(3)]*mulx+w2, star[OFFSET_Y(3)]*muly+h2, | |||||
| "#"); | |||||
| cucul_fill_triangle(mask, | |||||
| star[OFFSET_X(3)]*mulx+w2, star[OFFSET_Y(3)]*muly+h2, | |||||
| star[OFFSET_X(4)]*mulx+w2, star[OFFSET_Y(4)]*muly+h2, | |||||
| star[OFFSET_X(5)]*mulx+w2, star[OFFSET_Y(5)]*muly+h2, | |||||
| "#"); | |||||
| cucul_fill_triangle(mask, | |||||
| star[OFFSET_X(5)]*mulx+w2, star[OFFSET_Y(5)]*muly+h2, | |||||
| star[OFFSET_X(6)]*mulx+w2, star[OFFSET_Y(6)]*muly+h2, | |||||
| star[OFFSET_X(7)]*mulx+w2, star[OFFSET_Y(7)]*muly+h2, | |||||
| "#"); | |||||
| cucul_fill_triangle(mask, | |||||
| star[OFFSET_X(7)]*mulx+w2, star[OFFSET_Y(7)]*muly+h2, | |||||
| star[OFFSET_X(8)]*mulx+w2, star[OFFSET_Y(8)]*muly+h2, | |||||
| star[OFFSET_X(9)]*mulx+w2, star[OFFSET_Y(9)]*muly+h2, | |||||
| "#"); | |||||
| cucul_fill_triangle(mask, | |||||
| star[OFFSET_X(9)]*mulx+w2, star[OFFSET_Y(9)]*muly+h2, | |||||
| star[OFFSET_X(1)]*mulx+w2, star[OFFSET_Y(1)]*muly+h2, | |||||
| star[OFFSET_X(5)]*mulx+w2, star[OFFSET_Y(5)]*muly+h2, | |||||
| "#"); | |||||
| cucul_fill_triangle(mask, | |||||
| star[OFFSET_X(9)]*mulx+w2, star[OFFSET_Y(9)]*muly+h2, | |||||
| star[OFFSET_X(5)]*mulx+w2, star[OFFSET_Y(5)]*muly+h2, | |||||
| star[OFFSET_X(7)]*mulx+w2, star[OFFSET_Y(7)]*muly+h2, | |||||
| "#"); | |||||
| cucul_fill_triangle(mask, | |||||
| star[OFFSET_X(1)]*mulx+w2, star[OFFSET_Y(1)]*muly+h2, | |||||
| star[OFFSET_X(3)]*mulx+w2, star[OFFSET_Y(3)]*muly+h2, | |||||
| star[OFFSET_X(5)]*mulx+w2, star[OFFSET_Y(5)]*muly+h2, | |||||
| "#"); | |||||
| break; | |||||
| case TRANSITION_CIRCLE: | |||||
| cucul_fill_ellipse(mask, | |||||
| w2, | |||||
| h2, | |||||
| mulx, | |||||
| muly, | |||||
| "#"); | |||||
| break; | |||||
| } | |||||
| } | |||||
| /* The plasma effect */ | /* The plasma effect */ | ||||
| #define TABLEX (XSIZ * 2) | #define TABLEX (XSIZ * 2) | ||||
| #define TABLEY (YSIZ * 2) | #define TABLEY (YSIZ * 2) | ||||
| @@ -620,7 +712,7 @@ void langton(enum action action, cucul_canvas_t *cv) | |||||
| { | { | ||||
| dir[a] = (dir[a] + 3) % 4; | dir[a] = (dir[a] + 3) % 4; | ||||
| screen[ax[a] + width * ay[a]] = (a << 4) | 0x0f; | screen[ax[a] + width * ay[a]] = (a << 4) | 0x0f; | ||||
| } | |||||
| } | |||||
| ax[a] = (width + ax[a] + steps[dir[a]][0]) % width; | ax[a] = (width + ax[a] + steps[dir[a]][0]) % width; | ||||
| ay[a] = (height + ay[a] + steps[dir[a]][1]) % height; | ay[a] = (height + ay[a] + steps[dir[a]][1]) % height; | ||||
| } | } | ||||