90 lines
2.1 KiB
Arduino
90 lines
2.1 KiB
Arduino
|
// Animates white pixels to simulate flying through a star field
|
||
|
|
||
|
#include <SPI.h>
|
||
|
#include <TFT_eSPI.h>
|
||
|
|
||
|
// Use hardware SPI
|
||
|
TFT_eSPI tft = TFT_eSPI();
|
||
|
|
||
|
// With 1024 stars the update rate is ~65 frames per second
|
||
|
#define NSTARS 1024
|
||
|
uint8_t sx[NSTARS] = {};
|
||
|
uint8_t sy[NSTARS] = {};
|
||
|
uint8_t sz[NSTARS] = {};
|
||
|
|
||
|
uint8_t za, zb, zc, zx;
|
||
|
|
||
|
// Fast 0-255 random number generator from http://eternityforest.com/Projects/rng.php:
|
||
|
uint8_t __attribute__((always_inline)) rng()
|
||
|
{
|
||
|
zx++;
|
||
|
za = (za^zc^zx);
|
||
|
zb = (zb+za);
|
||
|
zc = ((zc+(zb>>1))^za);
|
||
|
return zc;
|
||
|
}
|
||
|
|
||
|
void setup() {
|
||
|
za = random(256);
|
||
|
zb = random(256);
|
||
|
zc = random(256);
|
||
|
zx = random(256);
|
||
|
|
||
|
Serial.begin(115200);
|
||
|
tft.init();
|
||
|
tft.setRotation(1);
|
||
|
tft.fillScreen(TFT_BLACK);
|
||
|
|
||
|
// fastSetup() must be used immediately before fastPixel() to prepare screen
|
||
|
// It must be called after any other graphics drawing function call if fastPixel()
|
||
|
// is to be called again
|
||
|
//tft.fastSetup(); // Prepare plot window range for fast pixel plotting
|
||
|
}
|
||
|
|
||
|
void loop()
|
||
|
{
|
||
|
unsigned long t0 = micros();
|
||
|
uint8_t spawnDepthVariation = 255;
|
||
|
|
||
|
for(int i = 0; i < NSTARS; ++i)
|
||
|
{
|
||
|
if (sz[i] <= 1)
|
||
|
{
|
||
|
sx[i] = 160 - 120 + rng();
|
||
|
sy[i] = rng();
|
||
|
sz[i] = spawnDepthVariation--;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
int old_screen_x = ((int)sx[i] - 160) * 256 / sz[i] + 160;
|
||
|
int old_screen_y = ((int)sy[i] - 120) * 256 / sz[i] + 120;
|
||
|
|
||
|
// This is a faster pixel drawing function for occassions where many single pixels must be drawn
|
||
|
tft.drawPixel(old_screen_x, old_screen_y,TFT_BLACK);
|
||
|
|
||
|
sz[i] -= 2;
|
||
|
if (sz[i] > 1)
|
||
|
{
|
||
|
int screen_x = ((int)sx[i] - 160) * 256 / sz[i] + 160;
|
||
|
int screen_y = ((int)sy[i] - 120) * 256 / sz[i] + 120;
|
||
|
|
||
|
if (screen_x >= 0 && screen_y >= 0 && screen_x < 320 && screen_y < 240)
|
||
|
{
|
||
|
uint8_t r, g, b;
|
||
|
r = g = b = 255 - sz[i];
|
||
|
tft.drawPixel(screen_x, screen_y, tft.color565(r,g,b));
|
||
|
}
|
||
|
else
|
||
|
sz[i] = 0; // Out of screen, die.
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
unsigned long t1 = micros();
|
||
|
//static char timeMicros[8] = {};
|
||
|
|
||
|
// Calcualte frames per second
|
||
|
Serial.println(1.0/((t1 - t0)/1000000.0));
|
||
|
}
|
||
|
|
||
|
|