xxxxxxxxxx
198
let lastFrameTime = 0;
let state = {
displayWaves: null,
sampling: null,
screenResolution: null,
canvasSize: null,
timeWarp: 1,
timeWarpStepSize: 0.5,
timestamp: 0
};
function setup() {
state.canvasSize = {
width: windowWidth,
height: windowHeight
};
state.screenResolution = {
// center on (0,0)
widthHigh: PI * 1,
widthLow: -PI * 1,
heigthHigh: 4,
heigthLow: -4
};
state.sampling = {
frequency: max(windowWidth / 10, 100),
frequencyStepSize: 25,
minFrequency: 25,
low: state.screenResolution.widthLow,
high: state.screenResolution.widthHigh
};
lastFrameTime = new Date().getTime();
createCanvas(state.canvasSize.width, state.canvasSize.height);
initializeDisplayWaves();
}
function keyPressed() {
switch (keyCode) {
case 171: // fall-through // PLUS
case 107: // Numpad-PLUS
state.displayWaves.push(createDisplayWave());
break;
case 173: // fall-through // dash
case 109: // Numpad-MINUS
state.displayWaves.pop();
break;
case 39: // ARROW_RIGHT
state.timeWarp += state.timeWarpStepSize;
break;
case 37: // ARROW_LEFT
state.timeWarp -= state.timeWarpStepSize;
break;
case 32: // SPACE
writeState();
break;
case 13: // ENTER
readState();
break;
case 72: // Letter H
showHelp();
break;
case 78: // Letter N
initializeDisplayWaves();
state.timeWarp = 1;
state.timestamp = 0;
break;
case 190: // PERIOD
state.sampling.frequency += state.sampling.frequencyStepSize;
break;
case 188: // COMMA
state.sampling.frequency -= state.sampling.frequencyStepSize
state.sampling.frequency = max(state.sampling.frequency, state.sampling.minFrequency);
break;
}
}
function showHelp() {
let text = 'Made with ❤️ by Tim \n';
text += 'Provided with ✨ under the Unlicense \n';
text += 'H - Give me a helping hand \n';
text += 'N - Start over with a New sketch \n';
text += 'right - Increase time speed \n';
text += 'left - Decrease time speed \n';
text += 'plus - Add wave \n';
text += 'minus - Remove last added wave \n';
text += 'space - Give me the current configuration to share with my friends \n';
text += 'enter - I want to enter the configuration of my friend \n';
alert(text);
}
function initializeDisplayWaves() {
state.displayWaves = [];
for (let i = 0; i < 3; i++) {
state.displayWaves.push(createDisplayWave());
}
}
function createDisplayWave() {
let waves = [];
for (let j = 0; j < random(3, 8); j++) {
waves.push(
new Wave(random(-PI, PI), random(0, 1), random(0, 5))
);
}
let waveAnimation = new WaveAnimation(waves,
random(-0.0015, 0.0015), 0, random(-0.0002, 0.0002),
0, 0, 0);
let r = new Wave(random(-PI, PI), 1, random(0, 5));
let g = new Wave(random(-PI, PI), 1, random(0, 5));
let b = new Wave(random(-PI, PI), 1, random(0, 5));
let colorAnimation = new WaveAnimation([r, g, b],
random(-0.0015, 0.0015), 0, random(-0.0002, 0.0002),
0, 0, 0);
let displayWave = new DisplayWave(waveAnimation, colorAnimation);
return displayWave;
}
function writeState() {
let writeState = {};
writeState.displayWaves = state.displayWaves;
writeState.timeWarp = state.timeWarp;
writeState.timestamp = state.timestamp;
let json = JSON.stringify(writeState);
let base64 = btoa(json);
alert(base64);
}
function readState() {
let base64 = prompt("Please provide a state json");
let json = atob(base64);
let tmp = JSON.parse(json);
try {
for (let i = 0; i < tmp.displayWaves.length; i++) {
for (let j = 0; j < tmp.displayWaves[i].waveAnimation.waves.length; j++) {
let wave = new Wave();
Object.assign(wave, tmp.displayWaves[i].waveAnimation.waves[j]);
tmp.displayWaves[i].waveAnimation.waves[j] = wave;
}
for (let j = 0; j < tmp.displayWaves[i].colorAnimation.waves.length; j++) {
let wave = new Wave();
Object.assign(wave, tmp.displayWaves[i].colorAnimation.waves[j]);
tmp.displayWaves[i].colorAnimation.waves[j] = wave;
}
let waveAnimation = new WaveAnimation();
Object.assign(waveAnimation, tmp.displayWaves[i].waveAnimation);
tmp.displayWaves[i].waveAnimation = waveAnimation;
let colorAnimation = new WaveAnimation();
Object.assign(colorAnimation, tmp.displayWaves[i].colorAnimation);
tmp.displayWaves[i].colorAnimation = colorAnimation;
let displayWave = new DisplayWave();
Object.assign(displayWave, tmp.displayWaves[i]);
tmp.displayWaves[i] = displayWave;
}
Object.assign(state, tmp);
} catch (e) {
alert("Invalid json input");
}
}
function draw() {
background(0);
noFill();
strokeWeight(2);
let now = new Date().getTime();
let frameTime = (now - lastFrameTime) * state.timeWarp;
lastFrameTime = now;
state.timestamp += frameTime;
for (let displayWave of state.displayWaves) {
displayWave.draw(state.canvasSize, state.screenResolution, state.sampling);
displayWave.update(frameTime);
}
let fontSize = 15;
noStroke();
fill(127);
textSize(fontSize);
textAlign(CENTER, CENTER);
text('Made with ❤️ by Tim', width / 2, height - fontSize);
if (state.timestamp > 2000) {
fontSize = 10;
textSize(fontSize);
text('Press H for Help', width / 2, fontSize);
}
}