borgware-2d/animations/matrix.c

99 lines
2.1 KiB
C
Raw Normal View History

#include "../config.h"
#include <stdint.h>
#include "../random/prng.h"
#include "../pixel.h"
#include "../util.h"
typedef struct{
pixel start;
unsigned char len;
unsigned char decay;
unsigned char index;
unsigned char speed;
} streamer;
typedef uint8_t pixel_matrix_t[NUM_COLS][NUM_ROWS/4];
inline static uint8_t get_bright(pixel_matrix_t *matrix, uint8_t x, uint8_t y){
uint8_t ret;
ret = (*matrix)[x][y/4];
return 0x3&(ret>>(2*(y%4)));
}
inline static void set_bright(pixel_matrix_t *matrix, uint8_t x, uint8_t y, uint8_t value){
uint8_t t;
t = (*matrix)[x][y/4];
t &= ~(0x3<<(2*(y%4)));
t |= value<<(2*(y%4));
(*matrix)[x][y/4] = t;
}
void matrix() {
unsigned int counter = 500; /* run 500 cycles */
streamer streamers[STREAMER_NUM];
pixel_matrix_t matrix_bright;
unsigned char x, y;
unsigned char index = 0;
unsigned char draw;
unsigned char streamer_num = 0;
while(counter--){
unsigned char i, j;
/* initialise matrix-buffer */
for(x=0;x<NUM_COLS;x++)
for(y=0;y<NUM_ROWS/4;y++)
matrix_bright[x][y]=0;
for(i=0;i<streamer_num;i++){
streamer str = streamers[i];
unsigned char bright = 0xFF; draw = 0;
for(j=(str.len/8);j!=0xFF;j--){ /* Draw streamer */
if(j+str.start.y<NUM_ROWS){
if(bright>>6) /* bright>>6 */
draw = 1;
if(bright > (get_bright(&matrix_bright, str.start.x, str.start.y+j)<<6) ){
set_bright(&matrix_bright, str.start.x, str.start.y+j, bright>>6);
}
}
bright-=((bright>>5)*str.decay);
}
str.len+=str.speed/2;
streamers[i] = str;
if(!draw){
for(j=i;j<streamer_num-1;j++){
streamers[j] = streamers[j+1];
}
streamer_num--;
i--;
}
}
for(y=0;y<NUM_ROWS;y++)
for(x=0;x<NUM_COLS;x++){
setpixel((pixel){x,y}, get_bright(&matrix_bright,x,y));
}
unsigned char nsc;
for(nsc=0;nsc<6;nsc++){
if(streamer_num<STREAMER_NUM){
unsigned char sy = random8()%(2*NUM_ROWS);
if (sy>NUM_ROWS-1) sy=0;
streamers[streamer_num] = (streamer){{random8()%NUM_COLS, sy}, 0, (random8()%8)+12, index++,(random8()%16)+3};
streamer_num++;
}
}
wait(60);
}
}