let _aryInitNoiseXYZ = [];
let _aryNoiseRangeXYZ = [];
if (windowWidth <= windowHeight) {
canvasSize = windowWidth;
canvasSize = windowHeight;
createCanvas(1112, 834, WEBGL);
document.getElementsByTagName('main')[0].style.margin = 0;
setAttributes('premultipliedAlpha', true);
_noise = new OpenSimplexNoise();
for (let i = 0; i < 3; i++) {
_aryStep[i] = _gridWidth / _aryNumTile[i];
for (let i = 0; i < 3; i++) {
_aryInitRot[i] = [random(2*PI), random([-1, 1])];
for (let i = 0; i < 4; i++) {
_aryInitNoiseXYZ[i] = [];
for (let j = 0; j < _numNoise; j++) {
_aryInitNoiseXYZ[i][j] = random(100);
_aryNoiseRangeXYZ[0] = 0.5*4;
_aryNoiseRangeXYZ[1] = 0.5*4;
_aryNoiseRangeXYZ[2] = 0.5*4;
directionalLight(255, 255, 255, -1, 1, -1);
rotateX(_aryInitRot[0][0] + frameCount/200 * _aryInitRot[0][1]);
rotateY(_aryInitRot[1][0] + frameCount/100 * _aryInitRot[1][1]);
rotateZ(_aryInitRot[2][0] + frameCount/150) * _aryInitRot[2][1];
for (let x = 0; x <_aryNumTile[0]+1; x++) {
for (let y = 0; y < _aryNumTile[1]+1; y++) {
for (let z = 0; z < _aryNumTile[2]+1; z++) {
let noiseVal = calculateOSNoise(x / _aryNumTile[0], y / _aryNumTile[1], z / _aryNumTile[2], 0);
if (noiseVal > threshold) {
let ratio = (noiseVal - threshold) / (1 - threshold)
ambientMaterial(z*20%255, 230, 230);
translate(-_gridWidth/2 + 1.3 * x * _aryStep[0], .8 * -_gridWidth/2 + y * _aryStep[1], -_gridWidth/2 + z * _aryStep[2]);
sphere(width/100 * ratio);
function deleteAry(ary, element) {
for (let i = ary.length-1; i >= 0; i--) {
if (ary[i] == element) { ary.splice(i, 1); }
function tube(numTile, gridWidth, start_x, start_y, start_z, direction, r, col) {
let step = gridWidth/numTile;
let startPosX = -gridWidth/2 + step * start_x;
let startPosY = -gridWidth/2 + step * start_y;
let startPosZ = -gridWidth/2 + step * start_z;
let endPosX = -gridWidth/2 + step * end_x;
let endPosY = -gridWidth/2 + step * end_y;
let endPosZ = -gridWidth/2 + step * end_z;
translate(startPosX, startPosY, startPosZ);
ambientMaterial(z*20%255, 230 * ratio**2, 230 * ratio**3);
translate(endPosX, endPosY, endPosZ);
translate((startPosY + endPosY)/2, -(startPosX + endPosX)/2, (startPosZ + endPosZ)/2);
cylinderHeight = endPosX - startPosX;
translate((startPosX + endPosX)/2, (startPosY + endPosY)/2, (startPosZ + endPosZ)/2);
ambientMaterial(z*20%255, 230 * ratio**2, 230 * ratio**3);
cylinderHeight = endPosY - startPosY;
translate((startPosX + endPosX)/2, (startPosZ + endPosZ)/2, -(startPosY + endPosY)/2);
cylinderHeight = endPosZ - startPosZ;
cylinder(r, cylinderHeight);
function calculateOSNoise(x, y, z, i) {
let noiseVal = sin(2*PI*freq * _noise.noise3D(
_aryInitNoiseXYZ[0][i] + _aryNoiseRangeXYZ[0] * x + frameCount * _noiseStepT,
_aryInitNoiseXYZ[1][i]+ _aryNoiseRangeXYZ[1] * y + frameCount * _noiseStepT,
_aryInitNoiseXYZ[2][i] + _aryNoiseRangeXYZ[2] * z + frameCount * _noiseStepT
if (millis() - lapse > 400){
for (let i = 0; i < 3; i++) {
_aryInitRot[i] = [random(2*PI), random([-1, 1])];
for (let i = 0; i < 4; i++) {
_aryInitNoiseXYZ[i] = [];
for (let j = 0; j < _numNoise; j++) {
_aryInitNoiseXYZ[i][j] = random(100);