var rXOfst, rYOfst, rZOfst, phiOfst, thetaOfst, radiusOfst;
var rotY, rotX, scalar, wheelStep, wheelF;
createCanvas(windowWidth, windowHeight, WEBGL);
ortho(-windowWidth/2, windowWidth/2, windowHeight/2, -windowHeight/2, 1, 1000);
radiusOfst = random(100);
g = new Grid(20, 20, 20, 16);
function mouseWheel(event) {
wheelStep += event.delta;
function windowResized() {
resizeCanvas(windowWidth, windowHeight, WEBGL);
ortho(-windowWidth/2, windowWidth/2, windowHeight/2, -windowHeight/2, 1, 1000);
rotX = lerp(rotX, (mouseY-windowHeight/2)*.002, .25);
rotY = lerp(rotY, -HALF_PI*.5+(mouseX-windowWidth/2)*.001, .25);
scalar = map(mouseY, 0, windowHeight, 2, 1);
wheelF = lerp(wheelF, wheelStep*.01, .1);
pointLight(255, 0, 0, 255, 720, 0, 0);
pointLight(0, 0, 255, 255, 0, 0, 720);
pointLight(0, 255, 0, 255, 0, -720, 0);
function Vtx(initX, initY, initZ, lyrIdx, rowIdx, colIdx){
this.update = function(){
var idx = this.colIdx+this.rowIdx*20+this.lyrIdx*20*20;
this.lyrIdx*.075+wheelF*.5,
this.rowIdx*.075+wheelF*.5,
this.colIdx*.075+wheelF*.5);
this.lyrIdx*.05+wheelF*.5+rXOfst,
this.rowIdx*.05+wheelF*.5+rXOfst,
this.colIdx*.05-wheelF*.5+rXOfst)*TWO_PI;
this.lyrIdx*.05-wheelF*.75+rYOfst,
this.rowIdx*.05-wheelF*.75+rYOfst,
this.colIdx*.05+wheelF*.75+rYOfst)*TWO_PI;
this.lyrIdx*.05-wheelF+rZOfst,
this.rowIdx*.05+wheelF+rZOfst,
this.colIdx*.05-wheelF+rZOfst)*TWO_PI;
lyrIdx*.05+wheelF*.5+phiOfst,
rowIdx*.05+wheelF*.5+phiOfst,
colIdx*.05+wheelF*.5+phiOfst)*TWO_PI;
lyrIdx*.05-wheelF*.5+thetaOfst,
rowIdx*.05+wheelF*.5+thetaOfst,
colIdx*.05+wheelF*.5+thetaOfst)*TWO_PI;
lyrIdx*.05+wheelF*.5+radiusOfst,
rowIdx*.05-wheelF*.5+radiusOfst,
colIdx*.05+wheelF*.5+radiusOfst)*32;
var ofstX = radius*sin(theta)*cos(phi);
var ofstY = radius*cos(theta);
var ofstZ = radius*sin(theta)*sin(phi);
this.rX = lerp(this.rX, rXT, .05);
this.rY = lerp(this.rY, rYT, .05);
this.rZ = lerp(this.rZ, rZT, .05);
this.rX = lerp(this.rX, 0, .05);
this.rY = lerp(this.rY, 0, .05);
this.rZ = lerp(this.rZ, 0, .05);
this.posX = this.acrX+ofstX;
this.posY = this.acrY+ofstY;
this.posZ = this.acrZ+ofstZ;
this.display = function(){
translate(this.posX, this.posY, this.posZ);
box(this.s1, this.s2, this.s2);
function Grid(lyrs, rows, cols, cellSize){
this.cellSize = cellSize;
for (var i=0; i<this.lyrs; i++) {
for (var j=0; j<this.rows; j++) {
for (var k=0; k<this.cols; k++) {
if (i==this.lyrs-1 || j==this.rows-1 || k==this.cols-1 || i==0 || j==0 || k==0) {
(k-this.cols*.5)*this.cellSize+this.cellSize*.5,
(j-this.rows*.5)*this.cellSize+this.cellSize*.5,
(i-this.lyrs*.5)*this.cellSize+this.cellSize*.5,
this.update = function(){
for (var i=0; i<vts.length; i++) {
this.display = function(){
for (var i=0; i<vts.length; i++) {