/* built with Studio Sketchpad:
* https://sketchpad.cc
*
* observe the evolution of this sketch:
* https://studio.sketchpad.cc/sp/pad/view/ro.9SGeuGjnQgA/rev.26
*
* authors:
* GoToLoop
* license (unless otherwise specified):
* creative commons attribution-share alike 3.0 license.
* https://creativecommons.org/licenses/by-sa/3.0/
*/
/**
* Simulation of a Universe (v3.13)
* by Alejandro Rodriguez (Aroxalot) (2015/Feb/28)
* mod GoToLoop (2015/Mar/01)
*
* forum.Processing.org/two/discussion/9633/3d-universe-simulation-opengl
* www.YouTube.com/watch?v=HR67FyqCwhw&feature=youtu.be
* studio.ProcessingTogether.com/sp/pad/export/ro.9cEyzu18dPQIG/latest
*/
static final int DIM = 100, CHANCE = 500, DIAM = 5, DIFF = 3, FPS = 10;
static final float D = 2.5*DIM, RAD90 = 90*DEG_TO_RAD;
static final color[] INKS = {
#FF0000, #008000, #0000FF
};
final byte matters[][][] = new byte[DIM][DIM][DIM];
boolean isPaused, invertRot;
void setup() {
size(800, 800, P3D);
noSmooth();
noFill();
frameRate(FPS);
initUniverse();
}
void draw() {
background(0);
float xy = radians(frameCount) * (invertRot? -1 : 1);
camera(3*DIM, D - 8*DIM*cos(xy), D - 8*DIM*sin(xy), 3*DIM, D, D, 1, 0, 0);
renderUniverse();
}
void mousePressed() {
if (mouseButton == CENTER) initUniverse();
else if (mouseButton == RIGHT) invertRot = !invertRot;
else if (isPaused ^= true) noLoop();
else loop();
}
void renderUniverse() {
for (int i = 0; i != DIM; ++i) {
byte[][] mi = matters[i];
for (int j = 0; j != DIM; ++j) {
byte[] mj = mi[j];
for (int k = 0; k != DIM; ++k) {
byte mk = mj[k];
int x = constrain(i + (int)random(-DIFF, DIFF), 0, DIM-1);
int y = constrain(j + (int)random(-DIFF, DIFF), 0, DIM-1);
int z = constrain(k + (int)random(-DIFF, DIFF), 0, DIM-1);
if ((matters[x][y][z] = mk) >= 0)
drawMatter(i*DIAM, j*DIAM, k*DIAM, INKS[mk]);
}
}
}
}
void drawMatter(int x, int y, int z, color c) {
fill(c);
pushMatrix();
translate(x, y, z);
rotateX(RAD90);
box(DIAM);
popMatrix();
}
void initUniverse() {
for (byte[][] i : matters) for (byte[] j : i)
for (int rnd = (int)random(CHANCE), k = 0; k != DIM
; j[k++] = (byte)(rnd < INKS.length? rnd : -1));
}