|
|
@@ -31,6 +31,7 @@ |
|
|
|
|
|
|
|
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 metaballs(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 TRANSITION_FRAMES 40 |
|
|
|
|
|
|
|
#define TRANSITION_COUNT 2 |
|
|
|
#define TRANSITION_CIRCLE 0 |
|
|
|
#define TRANSITION_STAR 1 |
|
|
|
|
|
|
|
|
|
|
|
/* Common macros for dither-based demos */ |
|
|
|
#define XSIZ 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 */ |
|
|
|
static int frame = 0; |
|
|
|
|
|
|
@@ -64,6 +87,9 @@ int main(int argc, char **argv) |
|
|
|
|
|
|
|
int demo, next = -1, pause = 0, next_transition = DEMO_FRAMES; |
|
|
|
unsigned int i; |
|
|
|
int transition = cucul_rand(0, TRANSITION_COUNT); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Set up two canvases, a mask, and attach a display to the front one */ |
|
|
|
frontcv = cucul_create_canvas(0, 0); |
|
|
@@ -89,7 +115,7 @@ int main(int argc, char **argv) |
|
|
|
demo = cucul_rand(0, DEMOS); |
|
|
|
fn[demo](INIT, frontcv); |
|
|
|
|
|
|
|
for(;;) |
|
|
|
for(;;) |
|
|
|
{ |
|
|
|
/* Handle events */ |
|
|
|
caca_event_t ev; |
|
|
@@ -129,7 +155,7 @@ int main(int argc, char **argv) |
|
|
|
if(frame == next_transition) |
|
|
|
{ |
|
|
|
next = cucul_rand(0, DEMOS); |
|
|
|
if(next == demo) |
|
|
|
if(next == demo) |
|
|
|
next = (next + 1) % DEMOS; |
|
|
|
fn[next](INIT, backcv); |
|
|
|
} |
|
|
@@ -156,15 +182,12 @@ paused: |
|
|
|
cucul_set_color(mask, CUCUL_COLOR_LIGHTGRAY, CUCUL_COLOR_BLACK); |
|
|
|
cucul_clear_canvas(mask); |
|
|
|
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); |
|
|
|
} else { |
|
|
|
transition = cucul_rand(0, TRANSITION_COUNT); |
|
|
|
} |
|
|
|
|
|
|
|
cucul_set_color(frontcv, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE); |
|
|
@@ -186,6 +209,75 @@ end: |
|
|
|
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 */ |
|
|
|
#define TABLEX (XSIZ * 2) |
|
|
|
#define TABLEY (YSIZ * 2) |
|
|
@@ -620,7 +712,7 @@ void langton(enum action action, cucul_canvas_t *cv) |
|
|
|
{ |
|
|
|
dir[a] = (dir[a] + 3) % 4; |
|
|
|
screen[ax[a] + width * ay[a]] = (a << 4) | 0x0f; |
|
|
|
} |
|
|
|
} |
|
|
|
ax[a] = (width + ax[a] + steps[dir[a]][0]) % width; |
|
|
|
ay[a] = (height + ay[a] + steps[dir[a]][1]) % height; |
|
|
|
} |
|
|
|