let paletteJudge = ["Y","Y","Y","Y","N","Y","Y","Y","Y","N","N","Y","N","Y","N","N","Y","N","Y","Y","N","N","Y","N","Y","Y","Y","Y","Y","N","N","N","Y","Y","N","N","Y","Y","Y","N"]
createCanvas(windowWidth, windowHeight, WEBGL);
myShader = createShader(vert, frag);
setIntervalId = setInterval (generate,5000)
function mousePressed() {
clearInterval(setIntervalId);
if (key == "n" || key == "N") paletteJudge[judgeIndex] = "N";
else paletteJudge[judgeIndex] = "Y";
print(JSON.stringify(paletteJudge));
grid = new FlexGrid(min(width, height) / 8);
judgeIndex = (judgeIndex + 1) % palettes.length;
pal = palettes[judgeIndex];
if (paletteJudge[judgeIndex] != "N") break;
let pa = pal.slice(0, int(pal.length / 2));
let pb = pal.slice(int(pal.length / 2));
if (random() < 0.5)[pa, pb] = [pb, pa];
]).map(i => drawElement[i]);
for (let i = 0; i < n; i++) {
i < n / 2 ? random([1, 2]) : 1, {
angle: random([0, 1, 2, 3]) * PI / 2,
shaderSettingFill: random(shaderSettings),
shaderSettingBkg: random(shaderSettings),
return [red(c) / 255, green(c) / 255, blue(c) / 255];
let t = millis() * 0.001;
let lightDir = createVector(0.5, 0.5, 0.5).rotate(t).normalize();
myShader.setUniform('u_light_dir', lightDir.array());
myShader.setUniform('u_resolution', [width, height]);
let u_cell_bkg, u_cell_fill;
for (let [variable, value] of shaderSettingBkg) {
myShader.setUniform(variable, value);
if (variable == 'u_cell') u_cell_bkg = value;
myShader.setUniform('u_color', glColor(bkgColor));
rect(-width / 2, -height / 2, width, height);
for (let el of grid.elements) {
grid.elementTransform(el);
for (let [variable, value] of el.data.shaderSettingBkg) {
myShader.setUniform(variable, value);
if (variable == 'u_cell') u_cell_fill = value;
myShader.setUniform('u_color', glColor(el.data.bkg));
if (el.sz > 1) myShader.setUniform('u_cell', u_cell_bkg*1.2);
for (let [variable, value] of el.data.shaderSettingFill) {
myShader.setUniform(variable, value);
myShader.setUniform('u_color', glColor(el.data.fill));
if (el.sz > 1) myShader.setUniform('u_cell',u_cell_fill*1.2);
let ncols = floor(width / cellSize);
let nrows = floor(height / cellSize);
let dx = floor((width - ncols * cellSize) / 2);
let dy = floor((height - nrows * cellSize) / 2);
for (let i = 0; i < ncols * nrows; i++) free.add(i);
return this.ncols * this.nrows;
translate(-width / 2 + this.dx + (el.col + el.sz / 2) * this.cellSize,
-height / 2 + this.dy + (el.row + el.sz / 2) * this.cellSize);
scale(this.cellSize * el.sz);
let freeIndices = shuffle([...free], true);
for (let cellIndex of freeIndices) {
let row = int(cellIndex / ncols);
if (row + sz > nrows) continue;
let col = cellIndex % ncols;
if (col + sz > ncols) continue;
for (let i = 0; i < sz && ok; i++) {
for (let j = 0; j < sz && ok; j++) {
let index = (row + i) * ncols + col + j;
if (grid[index]) ok = false;
for (let i = 0; i < sz && ok; i++) {
for (let j = 0; j < sz && ok; j++) {
let index = (row + i) * ncols + col + j;