nucliweb
6/13/2017 - 11:02 PM

winders

winders

// gif by dave aka @beesandbombs :)

int[][] result;
float t, c;

float ease(float p) {
  return 3*p*p - 2*p*p*p;
}

float ease(float p, float g) {
  if (p < 0.5) 
    return 0.5 * pow(2*p, g);
  else
    return 1 - 0.5 * pow(2*(1 - p), g);
}

float mn = .5*sqrt(3), ia = atan(sqrt(.5));

void push() {
  pushMatrix();
  pushStyle();
}

void pop() {
  popStyle();
  popMatrix();
}

void draw() {

  if (!recording) {
    t = mouseX*1.0/width;
    c = mouseY*1.0/height;
    if (mousePressed)
      println(c);
    draw_();
  } else {
    for (int i=0; i<width*height; i++)
      for (int a=0; a<3; a++)
        result[i][a] = 0;

    c = 0;
    for (int sa=0; sa<samplesPerFrame; sa++) {
      t = map(frameCount-1 + sa*shutterAngle/samplesPerFrame, 0, numFrames, 0, 1);
      draw_();
      loadPixels();
      for (int i=0; i<pixels.length; i++) {
        result[i][0] += pixels[i] >> 16 & 0xff;
        result[i][1] += pixels[i] >> 8 & 0xff;
        result[i][2] += pixels[i] & 0xff;
      }
    }

    loadPixels();
    for (int i=0; i<pixels.length; i++)
      pixels[i] = 0xff << 24 | 
        int(result[i][0]*1.0/samplesPerFrame) << 16 | 
        int(result[i][1]*1.0/samplesPerFrame) << 8 | 
        int(result[i][2]*1.0/samplesPerFrame);
    updatePixels();

    saveFrame("d###.gif");
    if (frameCount==numFrames)
      exit();
  }
}

//////////////////////////////////////////////////////////////////////////////

int samplesPerFrame = 4;
int numFrames = 300;        
float shutterAngle = .5;

boolean recording = false;

void setup() {
  size(640, 640, P3D);
  smooth(8);
  result = new int[width*height][3];
  rectMode(CENTER);
  fill(32);
  noStroke();
}

float x, y, z, tt;
int N = 720;
float th, tw, r = 50, ph, R = 180;
float lc;
color BLUE = #00f6ff, PURPLE = #731b6e;

void sph(float q) {
  stroke(0);
  strokeWeight(4);
  noFill();
  beginShape();
  for (int i=0; i<N; i++) {
    tw = 2.5*PI*q;
    th = i*TWO_PI/N;

    ph = cos(th)*tw;
    y = r*cos(th);
    x = r*sin(th)*cos(ph);
    z = r*sin(th)*sin(ph);

    lc = constrain(map(modelZ(x, y, z), r, -r, -.25, 1), 0, 1);
    lc = lerp(lc, 1-sq(1-lc), .5);
    stroke(lerpColor(BLUE, PURPLE, lc));
    vertex(x, y, z);
  }
  endShape(CLOSE);
}

float rot;

void draw_() {
  background(0); 
  push();
  translate(width/2, height/2);
  for (int i=0; i<8; i++) {
    rot = TWO_PI*(i+t)/8;
    push();
    translate(R*cos(rot), R*sin(rot));
    rotateX(rot*2);
    sph(ease(map(sin(rot), 1, -1, 0, 1), 2.5));
    pop();
  }
  pop();
}