xxxxxxxxxx
141
let num = 20; //size of grid
let size = 10; //size of cells
let grid = [];
let hueValue = 0; //color change
let button; //next stage button
let button2; // orbit control button
let mouseControl = false;
function setup() {
createCanvas(600, 600, WEBGL);
colorMode(HSB, 255);
angleMode(DEGREES);
button = createButton('Next Stage');
button.size(100, 50);
button.style("font-size", "17px");
button.position(0, 0);
button.mousePressed(update);
button2 = createButton('Orbit Control');
button2.size(100, 50);
button2.style("font-size", "17px");
button2.position(110, 0);
button2.mousePressed(orbitToggle);
for (let i = 0; i < num; i++) {
grid[i] = [];
for (let j = 0; j < num; j++) {
grid[i][j] = [];
for (let k = 0; k < num; k++) {
let mid = num / 2;
let margin = 2; //how many cells around starting middle cube per side
let min = mid - margin;
let max = mid + margin;
if (
i >= min &&
i <= max &&
j >= min &&
j <= max &&
k >= min &&
k <= max
) {
grid[i][j][k] = 1;
} else {
grid[i][j][k] = 0;
}
}
}
}
}
function draw() {
background(0);
if (!mouseControl) { //move camera around
rotateX(-15);
rotateY(frameCount * 0.3);
} else {
orbitControl()
}
lights();
translate(
(-size * num) / 2 + size / 2,
(-size * num) / 2 + size / 2,
(-size * num) / 2 + size / 2
);
for (let i = 0; i < num; i++) {
for (let j = 0; j < num; j++) {
for (let k = 0; k < num; k++) {
if (grid[i][j][k] == 1) {
fill(hueValue, 255, 255);
noStroke();
push();
translate(i * size, j * size, k * size);
box(size);
pop();
}
}
}
}
if (hueValue > 255) { //reset color to 0 when it hits max
hueValue = 0;
}
hueValue += 1;
}
function update() {
let nextGen = [];
for (let i = 0; i < num; i++) {
nextGen[i] = [];
for (let j = 0; j < num; j++) {
nextGen[i][j] = [];
for (let k = 0; k < num; k++) {
let n = neighboringStates(grid, i, j, k);
let a = 1; //you can change these values arbitrarily
let b = 10;
let c = 1;
let d = 10;
if (grid[i][j][k] == 1) {
if (n >= a && n <= b) {
nextGen[i][j][k] = 1; //alive
} else {
nextGen[i][j][k] = 0; //dead
}
} else {
if (n >= c && n <= d) {
nextGen[i][j][k] = 1;
} else {
nextGen[i][j][k] = 0;
}
}
}
}
}
grid = nextGen;
}
function neighboringStates(grid, x, y, z) {
let sum = 0;
for (let i = -1; i < 2; i++) { //checks each neighboring cell
for (let j = -1; j < 2; j++) {
for (let k = -1; k < 2; k++) {
let xIndex = (x + i + num) % num; //mod to allow wraparound
let yIndex = (y + j + num) % num;
let zIndex = (z + k + num) % num;
sum += grid[xIndex][yIndex][zIndex];
}
}
}
sum -= grid[x][y][z]; //omit the cell that is being checked
return sum;
}
function orbitToggle() {
mouseControl = !mouseControl
}