Add some more patterns
This commit is contained in:
parent
27a319157d
commit
ad3337b3a3
7 changed files with 447 additions and 232 deletions
235
examples/AuroraDemo/PatternFireworks.hpp
Normal file
235
examples/AuroraDemo/PatternFireworks.hpp
Normal file
|
@ -0,0 +1,235 @@
|
||||||
|
#ifndef FireWork_H
|
||||||
|
#define FireWork_H
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
* Fireworks Class
|
||||||
|
****************************************************************/
|
||||||
|
// Ripped from: https://github.com/lmirel/MorphingClockRemix
|
||||||
|
|
||||||
|
const int FIREWORKS = 4; // Number of fireworks
|
||||||
|
const int FIREWORK_PARTICLES = 32; // Number of particles per firework
|
||||||
|
|
||||||
|
const float GRAVITY = 0.03f;
|
||||||
|
const float baselineSpeed = -1.2f;
|
||||||
|
const float maxSpeed = -2.0f;
|
||||||
|
|
||||||
|
class Firework
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
float x[FIREWORK_PARTICLES];
|
||||||
|
float y[FIREWORK_PARTICLES];
|
||||||
|
char lx[FIREWORK_PARTICLES], ly[FIREWORK_PARTICLES];
|
||||||
|
float xSpeed[FIREWORK_PARTICLES];
|
||||||
|
float ySpeed[FIREWORK_PARTICLES];
|
||||||
|
|
||||||
|
char red;
|
||||||
|
char blue;
|
||||||
|
char green;
|
||||||
|
char alpha;
|
||||||
|
|
||||||
|
int framesUntilLaunch;
|
||||||
|
|
||||||
|
char particleSize;
|
||||||
|
bool hasExploded;
|
||||||
|
|
||||||
|
Firework(); // Constructor declaration
|
||||||
|
void initialise();
|
||||||
|
void move();
|
||||||
|
void explode();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Constructor implementation
|
||||||
|
Firework::Firework()
|
||||||
|
{
|
||||||
|
initialise();
|
||||||
|
for (int loop = 0; loop < FIREWORK_PARTICLES; loop++)
|
||||||
|
{
|
||||||
|
lx[loop] = 0;
|
||||||
|
ly[loop] = VPANEL_H + 1; // Push the particle location down off the bottom of the screen
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Firework::initialise()
|
||||||
|
{
|
||||||
|
// Pick an initial x location and random x/y speeds
|
||||||
|
float xLoc = (rand() % VPANEL_W);
|
||||||
|
float xSpeedVal = baselineSpeed + (rand() % (int)maxSpeed);
|
||||||
|
float ySpeedVal = baselineSpeed + (rand() % (int)maxSpeed);
|
||||||
|
|
||||||
|
// Set initial x/y location and speeds
|
||||||
|
for (int loop = 0; loop < FIREWORK_PARTICLES; loop++)
|
||||||
|
{
|
||||||
|
x[loop] = xLoc;
|
||||||
|
y[loop] = VPANEL_H + 1; // Push the particle location down off the bottom of the screen
|
||||||
|
xSpeed[loop] = xSpeedVal;
|
||||||
|
ySpeed[loop] = ySpeedVal;
|
||||||
|
//don't reset these otherwise particles won't be removed
|
||||||
|
//lx[loop] = 0;
|
||||||
|
//ly[loop] = LAYER_HEIGHT + 1; // Push the particle location down off the bottom of the screen
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assign a random colour and full alpha (i.e. particle is completely opaque)
|
||||||
|
red = (rand() % 255);/// (float)RAND_MAX);
|
||||||
|
green = (rand() % 255); /// (float)RAND_MAX);
|
||||||
|
blue = (rand() % 255); /// (float)RAND_MAX);
|
||||||
|
alpha = 50;//max particle frames
|
||||||
|
|
||||||
|
// Firework will launch after a random amount of frames between 0 and 400
|
||||||
|
framesUntilLaunch = ((int)rand() % (VPANEL_H));
|
||||||
|
|
||||||
|
// Size of the particle (as thrown to glPointSize) - range is 1.0f to 4.0f
|
||||||
|
particleSize = 1.0f + ((float)rand() / (float)RAND_MAX) * 3.0f;
|
||||||
|
|
||||||
|
// Flag to keep trackof whether the firework has exploded or not
|
||||||
|
hasExploded = false;
|
||||||
|
|
||||||
|
//cout << "Initialised a firework." << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Firework::move()
|
||||||
|
{
|
||||||
|
for (int loop = 0; loop < FIREWORK_PARTICLES; loop++)
|
||||||
|
{
|
||||||
|
// Once the firework is ready to launch start moving the particles
|
||||||
|
if (framesUntilLaunch <= 0)
|
||||||
|
{
|
||||||
|
//draw black on last known position
|
||||||
|
//tl->drawPixel (x[loop], y[loop], cc_blk);
|
||||||
|
lx[loop] = x[loop];
|
||||||
|
ly[loop] = y[loop];
|
||||||
|
//
|
||||||
|
x[loop] += xSpeed[loop];
|
||||||
|
|
||||||
|
y[loop] += ySpeed[loop];
|
||||||
|
|
||||||
|
ySpeed[loop] += GRAVITY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
framesUntilLaunch--;
|
||||||
|
|
||||||
|
// Once a fireworks speed turns positive (i.e. at top of arc) - blow it up!
|
||||||
|
if (ySpeed[0] > 0.0f)
|
||||||
|
{
|
||||||
|
for (int loop2 = 0; loop2 < FIREWORK_PARTICLES; loop2++)
|
||||||
|
{
|
||||||
|
// Set a random x and y speed beteen -4 and + 4
|
||||||
|
xSpeed[loop2] = -2 + (rand() / (float)RAND_MAX) * 4;
|
||||||
|
ySpeed[loop2] = -2 + (rand() / (float)RAND_MAX) * 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
//cout << "Boom!" << endl;
|
||||||
|
hasExploded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Firework::explode()
|
||||||
|
{
|
||||||
|
for (int loop = 0; loop < FIREWORK_PARTICLES; loop++)
|
||||||
|
{
|
||||||
|
// Dampen the horizontal speed by 1% per frame
|
||||||
|
xSpeed[loop] *= 0.99;
|
||||||
|
|
||||||
|
//draw black on last known position (NO LONGER USED tl->dim used instead)
|
||||||
|
//tl->drawPixel (x[loop], y[loop], cc_blk);
|
||||||
|
lx[loop] = x[loop];
|
||||||
|
ly[loop] = y[loop];
|
||||||
|
//
|
||||||
|
// Move the particle
|
||||||
|
x[loop] += xSpeed[loop];
|
||||||
|
y[loop] += ySpeed[loop];
|
||||||
|
|
||||||
|
// Apply gravity to the particle's speed
|
||||||
|
ySpeed[loop] += GRAVITY;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fade out the particles (alpha is stored per firework, not per particle)
|
||||||
|
if (alpha > 0)
|
||||||
|
{
|
||||||
|
alpha -= 1;
|
||||||
|
}
|
||||||
|
else // Once the alpha hits zero reset the firework
|
||||||
|
{
|
||||||
|
initialise();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************** */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class PatternFirework : public Drawable {
|
||||||
|
|
||||||
|
public:
|
||||||
|
PatternFirework() {
|
||||||
|
name = (char *)"PatternFirework";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void start();
|
||||||
|
unsigned int drawFrame();
|
||||||
|
void stop();
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Create our array of fireworks
|
||||||
|
Firework fw[FIREWORKS];
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void PatternFirework::start() { }
|
||||||
|
|
||||||
|
void PatternFirework::stop() { }
|
||||||
|
|
||||||
|
unsigned int PatternFirework::drawFrame()
|
||||||
|
{
|
||||||
|
|
||||||
|
effects.DimAll(250);
|
||||||
|
|
||||||
|
CRGB cc_frw;
|
||||||
|
//display.fillScreen (0);
|
||||||
|
// Draw fireworks
|
||||||
|
//cout << "Firework count is: " << Firework::fireworkCount << endl;
|
||||||
|
for (int loop = 0; loop < FIREWORKS; loop++)
|
||||||
|
{
|
||||||
|
for (int particleLoop = 0; particleLoop < FIREWORK_PARTICLES; particleLoop++)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Set colour to yellow on way up, then whatever colour firework should be when exploded
|
||||||
|
if (fw[loop].hasExploded == false)
|
||||||
|
{
|
||||||
|
//glColor4f(1.0f, 1.0f, 0.0f, 1.0f);
|
||||||
|
cc_frw = CRGB (255, 255, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//glColor4f(fw[loop].red, fw[loop].green, fw[loop].blue, fw[loop].alpha);
|
||||||
|
//glVertex2f(fw[loop].x[particleLoop], fw[loop].y[particleLoop]);
|
||||||
|
cc_frw = CRGB (fw[loop].red, fw[loop].green, fw[loop].blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw the point
|
||||||
|
//glVertex2f(fw[loop].x[particleLoop], fw[loop].y[particleLoop]);
|
||||||
|
effects.setPixel (fw[loop].x[particleLoop], fw[loop].y[particleLoop], cc_frw);
|
||||||
|
// effects.setPixel (fw[loop].lx[particleLoop], fw[loop].ly[particleLoop], 0);
|
||||||
|
}
|
||||||
|
// Move the firework appropriately depending on its explosion state
|
||||||
|
if (fw[loop].hasExploded == false)
|
||||||
|
{
|
||||||
|
fw[loop].move();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fw[loop].explode();
|
||||||
|
}
|
||||||
|
//
|
||||||
|
//delay (10);
|
||||||
|
} // end loop
|
||||||
|
|
||||||
|
effects.ShowFrame();
|
||||||
|
|
||||||
|
return 20;
|
||||||
|
|
||||||
|
} // end drawframe
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,5 +1,6 @@
|
||||||
// Codetastic 2024
|
// Codetastic 2024
|
||||||
// ChatGPT was used to create this.
|
// ChatGPT was used to create this.
|
||||||
|
// It sucks.
|
||||||
|
|
||||||
#ifndef PatternTheMatrix_H
|
#ifndef PatternTheMatrix_H
|
||||||
#define PatternTheMatrix_H
|
#define PatternTheMatrix_H
|
93
examples/AuroraDemo/PatternRain.hpp
Normal file
93
examples/AuroraDemo/PatternRain.hpp
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
#ifndef PatternRain_H
|
||||||
|
#define PatternRain_H
|
||||||
|
|
||||||
|
// Codetastic 2024
|
||||||
|
|
||||||
|
struct rainDrop {
|
||||||
|
uint8_t x;
|
||||||
|
uint8_t y;
|
||||||
|
CRGB colour;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define MAX_RAINDROPS 128
|
||||||
|
|
||||||
|
class PatternRain : public Drawable {
|
||||||
|
|
||||||
|
public:
|
||||||
|
PatternRain()
|
||||||
|
{
|
||||||
|
name = (char *)"PatternRain";
|
||||||
|
}
|
||||||
|
|
||||||
|
void start() {
|
||||||
|
|
||||||
|
buffer = (uint16_t *) malloc(((VPANEL_W*VPANEL_H)+1)*sizeof(uint16_t)); // always alloc an extra amount for XY
|
||||||
|
}
|
||||||
|
|
||||||
|
void stop() {
|
||||||
|
|
||||||
|
free(buffer);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unsigned int drawFrame()
|
||||||
|
{
|
||||||
|
rain(32, 255, 224, 240, CRGB::Green);
|
||||||
|
|
||||||
|
effects.ShowFrame();
|
||||||
|
|
||||||
|
return 45; // 1000/45 frames per secton
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
struct rainDrop rainDrops[MAX_RAINDROPS];
|
||||||
|
int rainDropPos = 0;
|
||||||
|
|
||||||
|
uint16_t* buffer = NULL; // buffer of number
|
||||||
|
|
||||||
|
void rain(byte backgroundDepth, byte maxBrightness, byte spawnFreq, byte tailLength, CRGB rainColor)
|
||||||
|
{
|
||||||
|
CRGBPalette16 rain_p( CRGB::Black, rainColor );
|
||||||
|
|
||||||
|
// Dim routine
|
||||||
|
for (int16_t i = 0; i < VPANEL_W; i++) {
|
||||||
|
for (int16_t j = 0; j < VPANEL_H; j++) {
|
||||||
|
uint16_t xy = XY16(i, j);
|
||||||
|
effects.leds[xy].nscale8(tailLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Genrate a new raindrop if the randomness says we should
|
||||||
|
if (random(255) < spawnFreq) {
|
||||||
|
|
||||||
|
// Find a spare raindrop slot
|
||||||
|
for (int d = 0; d < MAX_RAINDROPS; d++) {
|
||||||
|
|
||||||
|
// This raindrop is done with, it has... dropped
|
||||||
|
if (rainDrops[d].y >= VPANEL_H ) // not currently in use
|
||||||
|
{
|
||||||
|
rainDrops[d].colour = ColorFromPalette(rain_p, random(backgroundDepth, maxBrightness));
|
||||||
|
rainDrops[d].x = random(VPANEL_W-1);
|
||||||
|
rainDrops[d].y = 0;
|
||||||
|
|
||||||
|
break; // exit until next time.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // end random spawn
|
||||||
|
|
||||||
|
// Iterate through all the rainDrops, draw the drop pixel on the layer
|
||||||
|
for (int d = 0; d < MAX_RAINDROPS; d++) {
|
||||||
|
effects.setPixel(rainDrops[d].x, rainDrops[d].y++, rainDrops[d].colour);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,103 +0,0 @@
|
||||||
// Codetastic 2024
|
|
||||||
// ChatGPT was used to create this.
|
|
||||||
|
|
||||||
#ifndef PatternSphereSpin_H
|
|
||||||
#define PatternSphereSpin_H
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <cmath>
|
|
||||||
|
|
||||||
struct Point3D {
|
|
||||||
float x, y, z;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Point2D {
|
|
||||||
int x, y;
|
|
||||||
};
|
|
||||||
|
|
||||||
class PatternSphereSpin : public Drawable {
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
std::vector<Point3D> points;
|
|
||||||
|
|
||||||
float angleX = 0.0f;
|
|
||||||
float angleY = 0.0f;
|
|
||||||
float distance = 3.0f;
|
|
||||||
|
|
||||||
|
|
||||||
Point2D project(Point3D point, float distance) {
|
|
||||||
Point2D projected;
|
|
||||||
projected.x = static_cast<int>((point.x / (distance - point.z)) * VPANEL_W / 2 + VPANEL_W / 2);
|
|
||||||
projected.y = static_cast<int>((point.y / (distance - point.z)) * VPANEL_H / 2 + VPANEL_H / 2);
|
|
||||||
return projected;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<Point3D> generateSpherePoints(int numPoints) {
|
|
||||||
std::vector<Point3D> points;
|
|
||||||
for (int i = 0; i < numPoints; ++i) {
|
|
||||||
float theta = 2 * PI * (i / static_cast<float>(numPoints));
|
|
||||||
for (int j = 0; j < numPoints / 2; ++j) {
|
|
||||||
float phi = PI * (j / static_cast<float>(numPoints / 2));
|
|
||||||
points.push_back({ cos(theta) * sin(phi), sin(theta) * sin(phi), cos(phi) });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return points;
|
|
||||||
}
|
|
||||||
|
|
||||||
void rotatePoints(std::vector<Point3D>& points, float angleX, float angleY) {
|
|
||||||
for (auto& point : points) {
|
|
||||||
// Rotate around the X axis
|
|
||||||
float y = point.y * cos(angleX) - point.z * sin(angleX);
|
|
||||||
float z = point.y * sin(angleX) + point.z * cos(angleX);
|
|
||||||
point.y = y;
|
|
||||||
point.z = z;
|
|
||||||
|
|
||||||
// Rotate around the Y axis
|
|
||||||
float x = point.x * cos(angleY) + point.z * sin(angleY);
|
|
||||||
z = -point.x * sin(angleY) + point.z * cos(angleY);
|
|
||||||
point.x = x;
|
|
||||||
point.z = z;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
PatternSphereSpin() {
|
|
||||||
name = (char *)"Sphere Spin";
|
|
||||||
}
|
|
||||||
|
|
||||||
void start()
|
|
||||||
{
|
|
||||||
points = generateSpherePoints(30);
|
|
||||||
angleX = 0.0f;
|
|
||||||
angleY = 0.0f;
|
|
||||||
distance = 3.0f;
|
|
||||||
};
|
|
||||||
|
|
||||||
unsigned int drawFrame() {
|
|
||||||
|
|
||||||
effects.ClearFrame();
|
|
||||||
|
|
||||||
// Rotate points
|
|
||||||
rotatePoints(points, angleX, angleY);
|
|
||||||
|
|
||||||
// Project and draw lines between points
|
|
||||||
for (size_t i = 0; i < points.size(); ++i) {
|
|
||||||
Point2D p1 = project(points[i], distance);
|
|
||||||
for (size_t j = i + 1; j < points.size(); ++j) {
|
|
||||||
Point2D p2 = project(points[j], distance);
|
|
||||||
effects.drawLine(p1.x, p1.y, p2.x, p2.y, CRGB(255,255,255));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update angles for rotation
|
|
||||||
angleX += 0.05f;
|
|
||||||
angleY += 0.05f;
|
|
||||||
|
|
||||||
effects.ShowFrame();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,77 +1,133 @@
|
||||||
// Codetastic 2024
|
|
||||||
// ChatGPT was used to create this.
|
|
||||||
|
|
||||||
#ifndef PatternStarfield_H
|
#ifndef PatternStarfield_H
|
||||||
#define PatternStarfield_H
|
#define PatternStarfield_H
|
||||||
|
|
||||||
#include <vector>
|
struct Star
|
||||||
|
{
|
||||||
|
Star() {
|
||||||
|
x = y = z = 0;
|
||||||
|
colour = CRGB::White;
|
||||||
|
}
|
||||||
|
|
||||||
#define STAR_COUNT 128
|
float x;
|
||||||
|
float y;
|
||||||
// Star structure
|
float z;
|
||||||
struct Star {
|
|
||||||
float x, y, z;
|
|
||||||
CRGB colour;
|
CRGB colour;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Based on https://github.com/sinoia/oled-starfield/blob/master/src/starfield.cpp
|
||||||
class PatternStarfield : public Drawable {
|
class PatternStarfield : public Drawable {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::vector<Star> stars;
|
const int starCount = 100; // number of stars in the star field
|
||||||
float speed = 0.5f;
|
const int maxDepth = 32; // maximum distance away for a star
|
||||||
|
|
||||||
public:
|
// the star field - starCount stars represented as x, y and z co-ordinates
|
||||||
PatternStarfield() {
|
// https://www.cplusplus.com/doc/tutorial/dynamic/
|
||||||
name = (char *)"Starfield";
|
Star * stars;
|
||||||
}
|
//CRGBPalette16 currentPalette;
|
||||||
|
|
||||||
void start()
|
unsigned int drawFrame() { // aka drawStars
|
||||||
{
|
|
||||||
|
|
||||||
stars.resize(STAR_COUNT);
|
// Dim routine
|
||||||
|
|
||||||
for (int i = 0; i < STAR_COUNT; ++i) {
|
for (int16_t i = 0; i < VPANEL_W; i++) {
|
||||||
stars[i] = { static_cast<float>(rand() % VPANEL_W - VPANEL_W / 2),
|
for (int16_t j = 0; j < VPANEL_H; j++) {
|
||||||
static_cast<float>(rand() % VPANEL_H - VPANEL_H / 2),
|
|
||||||
static_cast<float>(rand() % VPANEL_W),
|
|
||||||
effects.ColorFromCurrentPalette(rand()*255)
|
|
||||||
};
|
|
||||||
} // random positions
|
|
||||||
};
|
|
||||||
|
|
||||||
unsigned int drawFrame() {
|
uint16_t xy = XY16(i, j);
|
||||||
|
effects.leds[xy].nscale8(250);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
effects.DimAll(250);
|
int origin_x = VPANEL_W / 2;
|
||||||
|
int origin_y = VPANEL_H / 2;
|
||||||
|
|
||||||
// Update star positions
|
// Iterate through the stars reducing the z co-ordinate in order to move the
|
||||||
for (auto& star : stars) {
|
// star closer.
|
||||||
star.z -= speed;
|
for (int i = 0; i < starCount; ++i) {
|
||||||
if (star.z <= 0) {
|
stars[i].z -= 0.1;
|
||||||
star.z = VPANEL_W;
|
// if the star has moved past the screen (z < 0) reposition it far away
|
||||||
star.x = static_cast<float>(rand() % VPANEL_W - VPANEL_W / 2);
|
// with random x and y positions.
|
||||||
star.y = static_cast<float>(rand() % VPANEL_H - VPANEL_H / 2);
|
if (stars[i].z <= 0)
|
||||||
|
{
|
||||||
|
stars[i].x = getRandom(-25, 25);
|
||||||
|
stars[i].y = getRandom(-25, 25);
|
||||||
|
stars[i].z = maxDepth;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert the 3D coordinates to 2D using perspective projection.
|
||||||
|
float k = VPANEL_W / stars[i].z;
|
||||||
|
int x = static_cast<int>(stars[i].x * k + origin_x);
|
||||||
|
int y = static_cast<int>(stars[i].y * k + origin_y);
|
||||||
|
|
||||||
|
// Draw the star (if it is visible in the screen).
|
||||||
|
// Distant stars are smaller than closer stars.
|
||||||
|
if ((0 <= x and x < VPANEL_H)
|
||||||
|
and (0 <= y and y < VPANEL_H)) {
|
||||||
|
|
||||||
|
CRGB tmp = stars[i].colour;
|
||||||
|
//CRGB tmp = CRGB::White;
|
||||||
|
byte scale = 255 -(stars[i].z*7);
|
||||||
|
tmp.nscale8(scale);
|
||||||
|
|
||||||
|
effects.setPixel(x,y, CRGB(tmp.r,tmp.g,tmp.b));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
stars[i].z = -1; // set to -1 so it gets re-popualted
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// draw position
|
effects.ShowFrame();
|
||||||
for (const auto& star : stars) {
|
|
||||||
float k = 128.0f / star.z;
|
|
||||||
int x = static_cast<int>(star.x * k + VPANEL_W / 2);
|
|
||||||
int y = static_cast<int>(star.y * k + VPANEL_H / 2);
|
|
||||||
|
|
||||||
if (x >= 0 && x < VPANEL_W && y >= 0 && y < VPANEL_H) {
|
return 5;
|
||||||
|
|
||||||
// TODO: Get brighter as we get closer to edges?
|
|
||||||
effects.setPixel(x, y, star.colour);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
effects.ShowFrame();
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getRandom(int lower, int upper) {
|
||||||
|
/* Generate and return a random number between lower and upper bound */
|
||||||
|
return lower + static_cast<int>(rand() % (upper - lower + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
CRGB ColorFromCurrentPalette(uint8_t index = 0, uint8_t brightness = 255, TBlendType blendType = LINEARBLEND) {
|
||||||
|
return ColorFromPalette(currentPalette, index, brightness, blendType);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
public:
|
||||||
|
PatternStarfield()
|
||||||
|
{
|
||||||
|
name = (char *)"PatternStarfield";
|
||||||
|
}
|
||||||
|
|
||||||
|
void start() {
|
||||||
|
|
||||||
|
//currentPalette = RainbowColors_p;
|
||||||
|
//currentPalette = CloudColors_p;
|
||||||
|
|
||||||
|
// Allocate memory
|
||||||
|
stars = new Star[starCount];
|
||||||
|
|
||||||
|
// Initialise the star field with random stars
|
||||||
|
for (int i = 0; i < starCount; i++) {
|
||||||
|
stars[i].x = getRandom(-25, 25);
|
||||||
|
stars[i].y = getRandom(-25, 25);
|
||||||
|
stars[i].z = getRandom(0, maxDepth);
|
||||||
|
//stars[i].colour = ColorFromCurrentPalette(random(0, 128));
|
||||||
|
stars[i].colour = effects.ColorFromCurrentPalette(random(0, 128));
|
||||||
|
}
|
||||||
|
} // end start
|
||||||
|
|
||||||
|
void stop() {
|
||||||
|
|
||||||
|
delete[] stars;
|
||||||
|
delete stars;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -1,66 +0,0 @@
|
||||||
// Codetastic 2024
|
|
||||||
// ChatGPT was used to create this.
|
|
||||||
|
|
||||||
#ifndef PatternTunnel_H
|
|
||||||
#define PatternTunnel_H
|
|
||||||
|
|
||||||
class PatternTunnel : public Drawable {
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
uint8_t circlePositions[5] = {0, 6, 12, 18, 24}; // Initial positions of circles
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
PatternTunnel() {
|
|
||||||
name = (char *)"Tunnel";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Function to draw a circle on the matrix
|
|
||||||
void drawCircle(int centerX, int centerY, int radius, CRGB color) {
|
|
||||||
for (int y = -radius; y <= radius; y++) {
|
|
||||||
for (int x = -radius; x <= radius; x++) {
|
|
||||||
if (x*x + y*y <= radius*radius) {
|
|
||||||
int drawX = centerX + x;
|
|
||||||
int drawY = centerY + y;
|
|
||||||
if (drawX >= 0 && drawX < VPANEL_W && drawY >= 0 && drawY < VPANEL_H) {
|
|
||||||
effects.leds[XY(drawX, drawY)] = color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void start()
|
|
||||||
{
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
unsigned int drawFrame() {
|
|
||||||
|
|
||||||
effects.DimAll(250);
|
|
||||||
|
|
||||||
|
|
||||||
// Draw circles
|
|
||||||
for (int i = 0; i < 5; i++) {
|
|
||||||
int radius = circlePositions[i] % 32;
|
|
||||||
CRGB color = CHSV(map(radius, 0, 31, 0, 255), 255, 255);
|
|
||||||
drawCircle(VPANEL_W / 2, VPANEL_H / 2, radius, color);
|
|
||||||
|
|
||||||
// Move circles forward
|
|
||||||
circlePositions[i]++;
|
|
||||||
|
|
||||||
// Reset the position if the circle is out of bounds
|
|
||||||
if (circlePositions[i] >= 32) {
|
|
||||||
circlePositions[i] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
effects.ShowFrame();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -43,17 +43,17 @@
|
||||||
#include "PatternSpiral.hpp"
|
#include "PatternSpiral.hpp"
|
||||||
#include "PatternSpiro.hpp"
|
#include "PatternSpiro.hpp"
|
||||||
#include "PatternWave.hpp"
|
#include "PatternWave.hpp"
|
||||||
#include "PatternTheMatrix.hpp"
|
#include "PatternRain.hpp"
|
||||||
#include "PatternJuliaSetFractal.hpp"
|
#include "PatternJuliaSetFractal.hpp"
|
||||||
//#include "PatternTunnel.hpp" // fail
|
#include "PatternRain.hpp"
|
||||||
//#include "PatternSphereSpin.hpp" // fail
|
#include "PatternFireworks.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Patterns {
|
class Patterns {
|
||||||
private:
|
private:
|
||||||
|
|
||||||
PatternStarfield starfield;
|
PatternStarfield starfield;
|
||||||
// PatternSphereSpin sspin;
|
|
||||||
PatternAttract attract;
|
PatternAttract attract;
|
||||||
PatternBounce bounce;
|
PatternBounce bounce;
|
||||||
PatternCube cube;
|
PatternCube cube;
|
||||||
|
@ -74,16 +74,15 @@ class Patterns {
|
||||||
PatternSpiral spiral;
|
PatternSpiral spiral;
|
||||||
PatternSpiro spiro;
|
PatternSpiro spiro;
|
||||||
PatternWave wave;
|
PatternWave wave;
|
||||||
PatternTheMatrix matrix;
|
|
||||||
// PatternTunnel tunnel;
|
|
||||||
PatternJuliaSet juliaSet;
|
PatternJuliaSet juliaSet;
|
||||||
|
|
||||||
|
PatternRain rain;
|
||||||
|
PatternFirework fireworks;
|
||||||
|
|
||||||
|
|
||||||
std::vector<Drawable*> availablePatterns = {
|
std::vector<Drawable*> availablePatterns = {
|
||||||
// &tunnel,
|
|
||||||
&juliaSet,
|
&juliaSet,
|
||||||
&matrix,
|
|
||||||
&starfield,
|
&starfield,
|
||||||
// &sspin,
|
|
||||||
&attract,
|
&attract,
|
||||||
&bounce,
|
&bounce,
|
||||||
&cube,
|
&cube,
|
||||||
|
@ -102,10 +101,10 @@ class Patterns {
|
||||||
&plasma,
|
&plasma,
|
||||||
&radar,
|
&radar,
|
||||||
&simpnoise,
|
&simpnoise,
|
||||||
//&snake, // a bit crap
|
|
||||||
//&spiral, // a bit crap
|
|
||||||
&spiro,
|
&spiro,
|
||||||
&wave,
|
&wave,
|
||||||
|
&rain,
|
||||||
|
&fireworks
|
||||||
};
|
};
|
||||||
|
|
||||||
int currentIndex = 0;
|
int currentIndex = 0;
|
||||||
|
|
Loading…
Reference in a new issue