Skip to content

Commit 943fd2d

Browse files
committed
matrix is green now
1 parent fef329d commit 943fd2d

File tree

1 file changed

+75
-67
lines changed

1 file changed

+75
-67
lines changed

src/modules/gfx_matrix.c

+75-67
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Matrix-style lines moving from top to bottom.
1+
// Matrix-style runners moving from top to bottom.
22
// However, in random colors!
33
//
44
// Copyright (c) 2019, Adrian "vifino" Pistol <vifino@tty.sh>
@@ -21,6 +21,7 @@
2121
#include <random.h>
2222
#include <stddef.h>
2323
#include <stdlib.h>
24+
#include <stdio.h>
2425

2526
#define FPS 30
2627
#define FRAMETIME (T_SECOND / FPS)
@@ -33,60 +34,66 @@ static oscore_time nexttick;
3334
static int mx;
3435
static int my;
3536

36-
typedef struct line {
37+
typedef struct runner {
3738
RGB color;
3839
int pos_x;
3940
int pos_y;
4041
int speed;
41-
int length;
42-
} line;
43-
44-
static int numlines;
45-
static line* lines;
46-
47-
static RGB black = RGB(0, 0, 0);
48-
49-
static void randomize_line(int line) {
50-
lines[line].color = HSV2RGB(HSV(randn(255), 255, 255)); // HSV instead of RGB to get sameish brightness but differing color.
42+
} runner;
43+
44+
static int numrunners;
45+
static runner* runners;
46+
static int HYPERSPEED = 3;
47+
48+
49+
static void randomize_runner(runner * runner) {
50+
runner->color = HSV2RGB(HSV(randn(255), 255, 255));
51+
if (randn(4)==0){
52+
runner->pos_y = 0;
53+
} else if (runner->pos_y != my){
54+
runner->pos_y = randn(my-1);
55+
} else {
56+
runner->pos_y = randn(my/8);
57+
}
58+
runner->pos_x = randn(mx-1);
59+
runner->speed = randn(2)+1;
60+
}
5161

52-
lines[line].pos_y = -randn(my/4);
53-
lines[line].pos_x = randn(mx - 1);
62+
static RGB greenify(int intensity){
63+
if (intensity > 511) intensity = 511;
64+
if (intensity < 256) {
65+
return RGB(0,intensity,intensity/2);
66+
//return RGB(0,intensity/2,intensity);
67+
} else {
68+
return RGB(intensity-256,255,intensity/2);
69+
//return RGB(intensity-256,255,intensity/2);
70+
}
71+
}
5472

55-
int speed = 0;
56-
while (speed == 0)
57-
speed = randn(2);
58-
lines[line].speed = speed;
73+
static int degreenify(RGB px){
74+
if (px.red){
75+
return px.red + 256;
76+
} else {
77+
return px.green;
78+
}
79+
}
5980

60-
int length = 0;
61-
while (length < (my/4))
62-
length = randn(my/2);
63-
lines[line].length = length;
81+
int out_of_bounds(int x, int y){
82+
return (x >= mx) || (x < 0) || (y >= my) || (y < 0);
6483
}
6584

66-
static void randomize_lines() {
67-
int line;
68-
for (line = 0; line < numlines; ++line) {
69-
randomize_line(line);
70-
}
85+
void matrix_set_safe(int x, int y, RGB color){
86+
if (out_of_bounds(x,y)) return;
87+
matrix_set(x,y,color);
7188
}
7289

73-
static void update_lines() {
74-
int line;
75-
int y;
76-
for (line = 0; line < numlines; ++line) {
77-
y = lines[line].pos_y + lines[line].speed;
78-
79-
if ((y - lines[line].length) > my) {
80-
// clear old line
81-
/*int py;
82-
for (py = y; py >= (y - lines[line].length); py--)
83-
if (py < my)
84-
matrix_set(lines[line].pos_x, py, black);*/
85-
randomize_line(line);
86-
} else {
87-
lines[line].pos_y = y;
88-
}
89-
}
90+
void run_runner(runner * runner){
91+
if (!randn(runner->speed)) runner->pos_y++;
92+
if (out_of_bounds(runner->pos_x, runner->pos_y)){
93+
randomize_runner(runner);
94+
} else {
95+
matrix_set(runner->pos_x, runner->pos_y, greenify(400));
96+
}
9097
}
9198

9299
int init(int moduleno, char* argstr) {
@@ -96,10 +103,14 @@ int init(int moduleno, char* argstr) {
96103
if ((mx * my) < 16)
97104
return 1;
98105

99-
numlines = mx / 4; // not sure if this is the best thing to do, but meh.
100-
lines = malloc(numlines * sizeof(line));
106+
numrunners = mx/2; // not sure if this is the best thing to do, but meh.
107+
printf("numrunners %d\n",numrunners);
108+
runners = malloc(numrunners * sizeof(runner));
101109

102-
randomize_lines();
110+
int runner;
111+
for (runner = 0; runner < numrunners; ++runner){
112+
randomize_runner(&(runners[runner]));
113+
}
103114

104115
modno = moduleno;
105116
frame = 0;
@@ -108,29 +119,26 @@ int init(int moduleno, char* argstr) {
108119

109120
void reset(int _modno) {
110121
nexttick = udate();
111-
matrix_clear();
112-
122+
//matrix_clear();
113123
frame = 0;
114124
}
115125

116-
int draw(int _modno, int argc, char* argv[]) {
117-
int line;
118-
// clear out old points of lines
119-
for (line = 0; line < numlines; ++line) {
120-
int y = lines[line].pos_y - lines[line].length;
121-
int speed;
122-
for (speed = 0; speed <= lines[line].speed; speed++)
123-
if ((y - speed) >= 0 && (y - speed) < my)
124-
matrix_set(lines[line].pos_x, y - speed, black);
125-
}
126126

127-
// update the lines and draw them
128-
update_lines(); // todo, move back below matrix_render, to get a more consistant framerate
129-
for (line = 0; line < numlines; ++line) {
130-
int y;
131-
for (y = lines[line].pos_y - lines[line].length; y <= lines[line].pos_y; y++)
132-
if (y >= 0 && y < my)
133-
matrix_set(lines[line].pos_x, y, lines[line].color);
127+
int draw(int _modno, int argc, char* argv[]) {
128+
int x,y;
129+
for (x=0; x<mx; ++x){
130+
for (y=0;y<my; ++y){
131+
int intense_px = degreenify(matrix_get(x,y))*(256-HYPERSPEED*5)/256;
132+
RGB res = greenify(intense_px);
133+
matrix_set(x,y,res);
134+
}
135+
}
136+
int runner;
137+
int dont_care;
138+
for (runner = 0; runner < numrunners; ++runner) {
139+
for (dont_care=0;dont_care < HYPERSPEED; dont_care++){
140+
run_runner(&(runners[runner]));
141+
}
134142
}
135143

136144
matrix_render();
@@ -146,5 +154,5 @@ int draw(int _modno, int argc, char* argv[]) {
146154
}
147155

148156
void deinit(int _modno) {
149-
free(lines);
157+
free(runners);
150158
}

0 commit comments

Comments
 (0)