blobs

blobs is a sketching demonstration, as you paint on the touch screen a trail of circles follows.

The background is a repeated seamless texture ( thanks to Patrick Hoesly).

The code keeps a history of the last 128 touch positions, and draws the transparent, randomly colored circles.

#include <EEPROM.h>
#include <SPI.h>
#include <GD2.h>

#define NBLOBS      128
#define OFFSCREEN   -16384

struct xy {
  int x, y;
};

byte blob_i;
struct xy blobs[NBLOBS];

#include "blobs_assets.h"

void setup()
{
  GD.begin();

  LOAD_ASSETS();

  for (int i = 0; i < NBLOBS; i++) {
    blobs[i].x = OFFSCREEN;
    blobs[i].y = OFFSCREEN;
  }
}

void loop()
{
  GD.get_inputs();
  
  if (GD.inputs.x != -32768) {
    blobs[blob_i].x = GD.inputs.x << 4;
    blobs[blob_i].y = GD.inputs.y << 4;
  } else {
    blobs[blob_i].x = OFFSCREEN;
    blobs[blob_i].y = OFFSCREEN;
  }
  blob_i = (blob_i + 1) & (NBLOBS - 1);

  GD.ClearColorRGB(0xd0d0c0);
  GD.Clear();

  GD.Begin(BITMAPS);
  GD.BitmapSize(NEAREST, REPEAT, REPEAT, 480, 272);
  GD.Vertex2ii(0, 0);

  // Draw the blobs from oldest to youngest
  GD.Begin(POINTS);
  for (int i = 0; i < NBLOBS; i++) {

    // Blobs fade away and swell as they age
    GD.ColorA(i << 1);
    GD.PointSize((1024 + 16) - (i << 3));

    // Random color for each blob
    uint8_t j = (blob_i + i) & (NBLOBS - 1);
    byte r = j * 17;
    byte g = j * 23;
    byte b = j * 147;
    GD.ColorRGB(r, g, b);

    // Draw it!
    GD.Vertex2f(blobs[j].x, blobs[j].y);
  }
  GD.swap();
}