add overlay

This commit is contained in:
Felix Pankratz 2024-12-10 20:05:32 +01:00
parent 79586fbc66
commit d5879e10b3
2 changed files with 39 additions and 10 deletions

View File

@ -3,6 +3,7 @@
#include <ESP32-HUB75-MatrixPanel-I2S-DMA.h> #include <ESP32-HUB75-MatrixPanel-I2S-DMA.h>
#include "main.h" #include "main.h"
#include "overlay.h"
#define R1 42 #define R1 42
#define G1 40 #define G1 40
@ -57,6 +58,16 @@ void init_attractant() {
// int y = 15 + round(10 * cos(angle)); // int y = 15 + round(10 * cos(angle));
// attractant[x][y] = 15.0; // attractant[x][y] = 15.0;
//} //}
// draw a bitmap
//for(int x = 0; x < PANEL_WIDTH; x++) {
// for(int y = 0; y < PANEL_HEIGHT; y++) {
// int pixel_num = (y * PANEL_WIDTH) + x;
// if(overlay[ pixel_num / 8 ] & (1 << (7 - (pixel_num % 8)) ) ){
// attractant[x][y] = 15.0;
// }
// }
//}
} }
void init_agents() { void init_agents() {
@ -150,16 +161,17 @@ void setupGaussianKernel(float* kernel, int width, float sigma) {
#define GAUSS_WIDTH 5 #define GAUSS_WIDTH 5
#define GAUSS_SIGMA 1.0 #define GAUSS_SIGMA 1.0
#define DECAY_FACTOR 0.95 #define DECAY_FACTOR 0.9
float first_pass[PANEL_WIDTH][PANEL_HEIGHT];
void gaussian_blur() { void gaussian_blur() {
float kernel[GAUSS_WIDTH]; float kernel[GAUSS_WIDTH];
uint8_t first_pass[PANEL_WIDTH][PANEL_HEIGHT]; // first_pass[PANEL_WIDTH][PANEL_HEIGHT];
memset(first_pass, (uint8_t) 0, sizeof first_pass); memset(first_pass, 0.0, sizeof first_pass);
setupGaussianKernel(kernel, GAUSS_WIDTH, GAUSS_SIGMA); setupGaussianKernel(kernel, GAUSS_WIDTH, GAUSS_SIGMA);
// horizontal pass // horizontal pass
for (int x = 0; x < PANEL_WIDTH; x++) { for (int x = 0; x < PANEL_WIDTH; x++) {
for(int y = 0; y < PANEL_HEIGHT; y++) { for(int y = 0; y < PANEL_HEIGHT; y++) {
float sum = attractant[x][y] * kernel[0]; //0.0; float sum = attractant[x][y] * DECAY_FACTOR * kernel[0]; //0.0;
int additions = 1; int additions = 1;
for (int x_offset = 1; x_offset < GAUSS_WIDTH; x_offset++) { for (int x_offset = 1; x_offset < GAUSS_WIDTH; x_offset++) {
if (is_in_bounds(x+x_offset, y)) { if (is_in_bounds(x+x_offset, y)) {
@ -171,7 +183,7 @@ void gaussian_blur() {
additions++; additions++;
} }
} }
first_pass[x][y] = (int) round(sum/GAUSS_WIDTH * DECAY_FACTOR); first_pass[x][y] = sum/GAUSS_WIDTH;
} }
} }
// vertical pass // vertical pass
@ -189,13 +201,12 @@ void gaussian_blur() {
additions++; additions++;
} }
} }
attractant[x][y] = (sum/GAUSS_WIDTH) * DECAY_FACTOR; attractant[x][y] = sum/GAUSS_WIDTH;
} }
} }
} }
#define BLUR_KERNEL_SIZE 3 #define BLUR_KERNEL_SIZE 3
float first_pass[PANEL_WIDTH][PANEL_HEIGHT];
void box_blur() { void box_blur() {
//Serial.println("memset: starting"); //Serial.println("memset: starting");
memset(first_pass, 0.0, sizeof first_pass); memset(first_pass, 0.0, sizeof first_pass);
@ -204,7 +215,7 @@ void box_blur() {
for (int x = 0; x < PANEL_WIDTH; x++) { for (int x = 0; x < PANEL_WIDTH; x++) {
for(int y = 0; y < PANEL_HEIGHT; y++) { for(int y = 0; y < PANEL_HEIGHT; y++) {
float sum; float sum;
sum = attractant[x][y]; //0.0; sum = attractant[x][y] * DECAY_FACTOR; //0.0;
int additions = 1; int additions = 1;
for (int x_offset = 1; x_offset < BLUR_KERNEL_SIZE; x_offset++) { for (int x_offset = 1; x_offset < BLUR_KERNEL_SIZE; x_offset++) {
if (is_in_bounds(x+x_offset, y)) { if (is_in_bounds(x+x_offset, y)) {
@ -238,13 +249,13 @@ void box_blur() {
float result = (sum/additions); // * DECAY_FACTOR; float result = (sum/additions); // * DECAY_FACTOR;
//Serial.printf("result: %f", result); //additions: %d\n", sum, additions); //Serial.printf("result: %f", result); //additions: %d\n", sum, additions);
attractant[x][y] = (((8.0*attractant[x][y]) + result) / 9.0); attractant[x][y] = (((8.0*attractant[x][y]) + result) / 9.0);
attractant[x][y] = attractant[x][y] * DECAY_FACTOR;
} }
} }
} }
void loop() { void loop() {
matrix ->flipDMABuffer(); matrix ->flipDMABuffer();
delay(10);
//matrix->clearScreen(); //matrix->clearScreen();
matrix->fillScreenRGB888(15, 0, 10); matrix->fillScreenRGB888(15, 0, 10);
@ -289,7 +300,6 @@ void loop() {
agents[a].heading += AGENT_ANGLE * (PI * 2); agents[a].heading += AGENT_ANGLE * (PI * 2);
} }
} }
delay(10);
iterations++; iterations++;
if (iterations > 64 && iterations % 64 == 0) { // (( == 0) { if (iterations > 64 && iterations % 64 == 0) { // (( == 0) {
//gaussian_blur(); //gaussian_blur();

19
organism/src/overlay.h Normal file
View File

@ -0,0 +1,19 @@
const unsigned char overlay [] PROGMEM = {
// 'bw2, 64x32px
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00,
0x01, 0xf8, 0x00, 0x00, 0x00, 0x1c, 0x03, 0x80, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x1c, 0x03, 0x80,
0x01, 0xff, 0x00, 0x00, 0x00, 0x1c, 0x03, 0x80, 0x01, 0xc7, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x00,
0x01, 0xc3, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x01, 0xc3, 0x8f, 0xe1, 0xbe, 0x1c, 0x7b, 0x80,
0x01, 0xc3, 0x8f, 0xe1, 0xff, 0x1c, 0x73, 0x80, 0x01, 0xc3, 0x88, 0x71, 0xe7, 0x1c, 0xe3, 0x80,
0x01, 0xc3, 0x80, 0x71, 0xc3, 0x9d, 0xe3, 0x80, 0x01, 0xff, 0x00, 0x71, 0xc3, 0x9d, 0xc3, 0x80,
0x01, 0xff, 0x03, 0xf1, 0xc3, 0x9f, 0x83, 0x80, 0x01, 0xfc, 0x0f, 0xf1, 0xc3, 0x9f, 0xc3, 0x80,
0x01, 0xc0, 0x1f, 0x71, 0xc3, 0x9f, 0xc3, 0x80, 0x01, 0xc0, 0x3c, 0x71, 0xc3, 0x9d, 0xe3, 0x80,
0x01, 0xc0, 0x38, 0x71, 0xc3, 0x9c, 0xe3, 0x80, 0x01, 0xc0, 0x38, 0x71, 0xc3, 0x9c, 0xf3, 0x80,
0x01, 0xc0, 0x1c, 0xf1, 0xc3, 0x9c, 0x73, 0x80, 0x01, 0xc0, 0x1f, 0xf1, 0xc3, 0x9c, 0x7b, 0x80,
0x01, 0xc0, 0x0f, 0xb1, 0x83, 0x9c, 0x3b, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};