const canvas = document.getElementById("livestream_of_a_mountain_rebuilding_itself_canvas");
const ctx = canvas.getContext("2d", { willReadFrequently: true });
const initial_time = new Date();
ctx.canvas.width = window.innerWidth * 0.28;
ctx.canvas.height = window.innerHeight * 0.28;
var offset_magnitude = -0.4;
var framesSinceTap = 0;
var framesTapLasts = 4;
var x_tap_position = Math.floor(ctx.canvas.width / 2.0);
var y_tap_position = Math.floor(ctx.canvas.height / 2.0);
function getCursorPosition(canvas, e) {
const rect = canvas.getBoundingClientRect();
const x = event.clientX - rect.left;
const y = event.clientY - rect.top;
x_tap_position = Math.floor((x / rect.right) * ctx.canvas.width);
y_tap_position = Math.floor((y / rect.bottom) * ctx.canvas.height);
}
canvas.addEventListener('mousemove', function(e) {
framesSinceTap = 0;
getCursorPosition(canvas, e);
})
function startDrawing() {
var date = Date.now();
date = date / 2000.0;
var frame = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
var frame_original = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
var edge_fade_distance = (6 * (Math.sin((Date.now() / 6400)) + 1)) + 8;
function setPixel(x, y, red, green, blue, alpha) {
var index_position = (x + (y * ctx.canvas.width)) * 4;
frame.data[index_position] = red;
frame.data[index_position + 1] = green;
frame.data[index_position + 2] = blue;
frame.data[index_position + 3] = alpha;
}
var center_x = Math.floor(ctx.canvas.width * 0.5);
var center_y = Math.floor(ctx.canvas.height * 0.5);
center_y = Math.floor(center_y + (offset_magnitude * 0.2));
/* Feedback loop on noise */
for (let i = 0; i < ctx.canvas.width; i++) {
for (let j = 0; j < ctx.canvas.height; j++) {
var x_position = i;
if (center_x < i) {
x_position = Math.max(i - 2, 0);
} else if (center_x > i) {
x_position = Math.min(i + 2, ctx.canvas.width)
}
var y_position = j;
if (center_y < j) {
y_position = Math.max(j - 2 - (offset_magnitude * 0.00004), 0);
} else if (center_y > j) {
y_position = Math.min(j + 2 + (offset_magnitude * 0.00004), ctx.canvas.height);
}
var index_position = Math.floor((x_position + (y_position * ctx.canvas.width)) * 4);
var getRed = frame_original.data[index_position];
var getGreen = frame_original.data[index_position + 1];
var getBlue = frame_original.data[index_position + 2];
var getAlpha = frame_original.data[index_position + 3];
setPixel(i, j, getRed, getGreen, getBlue, getAlpha);
}
}
/* Add pixel wherever user touched */
if (framesSinceTap < framesTapLasts) {
var getRed = Math.ceil((Math.sin(Date.now() * 0.0021) + 1.0) * 32.0) * 8;
var getGreen = Math.ceil((Math.sin(Date.now() * 0.0004) + 1.0) * 32.0) * 8;
var getBlue = 256;
setPixel(x_tap_position, y_tap_position, 0, 0, 0, 256);
setPixel(x_tap_position + 1, y_tap_position, 0, 0, 0, 256);
setPixel(x_tap_position + 1, y_tap_position - 1, getRed, getGreen, getBlue, 256);
setPixel(x_tap_position - 1, y_tap_position, getRed, getGreen, getBlue, 256);
setPixel(x_tap_position - 1, y_tap_position + 1, getRed, getGreen, getBlue, 256);
setPixel(x_tap_position - 2, y_tap_position, getRed, getGreen, getBlue, 256);
setPixel(x_tap_position - 2, y_tap_position + 2, getRed, getGreen, getBlue, 256);
setPixel(x_tap_position - 3, y_tap_position + 3, getRed, getGreen, getBlue, 256);
setPixel((ctx.canvas.width - x_tap_position), y_tap_position, 0, 0, 0, 256);
setPixel((ctx.canvas.width - x_tap_position - 1), y_tap_position, 0, 0, 0, 256);
setPixel((ctx.canvas.width - x_tap_position - 3), y_tap_position + 2, 256, 256, 256, 256);
setPixel((ctx.canvas.width - x_tap_position + 1), y_tap_position, getRed, getGreen, getBlue, 256);
setPixel((ctx.canvas.width - x_tap_position + 2), y_tap_position + 2, getRed, getGreen, getBlue, 256);
}
/* Generate noise in center */
var x_width = Math.floor((1 + Math.sin(Date.now() * 0.00008)) * 4)
var y_width = Math.floor(((1 + Math.sin(Date.now() * 0.00028)) * 25) + Math.abs(offset_magnitude * 0.04))
var y_noise_offset = Math.floor(((1 + Math.sin(Date.now() * 0.00005)) * 29) + Math.abs(offset_magnitude * 0.09))
// Fix: If it's the first few seconds, make sure there is something on the screen
var current_time = new Date();
if (current_time - initial_time < 1600) {
x_width = Math.max(x_width, 1)
y_width = Math.max(y_width, 1);
y_noise_offset = Math.floor(y_noise_offset * 0.25)
}
for (let i = center_x - x_width; i < center_x + x_width; i++) {
for (let j = center_y - y_width; j < center_y + y_width; j++) {
var thisdate = Date.now();
var splitseconds = thisdate * 0.0004;
var getRed = Math.ceil((Math.sin(splitseconds + i + j + i + j) + 1.0) * 32.0) * 8;
var getGreen = Math.ceil((Math.sin(splitseconds + 1.1 - i - j - j) + 1.0) * 32.0) * 8;
var getBlue = 256;
// If it's the first 4800 milliseconds, do black/white
if (current_time - initial_time < 4800) {
var getRG = (getRed + getGreen);
if (getRG > 256) {
getRG = 256;
} else {
getRG = 0;
}
getRed = getRG;
getGreen = getRG;
getBlue = getRG;
}
setPixel(i, Math.min(j + y_noise_offset, ctx.canvas.height), getRed, getGreen, getBlue, 256);
}
}
framesSinceTap = framesSinceTap + 1;
ctx.putImageData(frame, 0, 0)
}
let startAnim = setInterval(startDrawing, 80);