wallpaper-womb3-simplex/index.html

418 lines
16 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<title>womb3</title>
<link rel="stylesheet" type="text/css" href="css/main.css" />
<link rel="stylesheet" type="text/css" href="css/fira.css" />
<link rel="stylesheet" type="text/css" href="css/hack.css" />
</head>
<body>
<header>
<h1 id="text">УТРОБА 3</h1>
</header>
<canvas class="shell"></canvas>
<svg style="position: absolute">
<defs>
<filter id="blob">
<feGaussianBlur in="SourceGraphic" stdDeviation="12" result="blur"></feGaussianBlur>
<feColorMatrix in="blur" mode="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 19 -9" result="blob">
</feColorMatrix>
</filter>
</defs>
</svg>
<script src="js/womb3-simplex.js" type="module"></script>
<script>
document.addEventListener('womb.loaded', function (e) {
for (const shell of document.getElementsByClassName('shell')) {
// Перебор оболочек
const layer = new e.detail.womb(shell);
if (layer instanceof e.detail.womb) {
// Удалось инициализировать слой
layer.init();
layer.generate();
// Инициализация сдвига
const text = document.getElementById('text');
const filter = document.getElementById('blob');
const blur = filter.getElementsByTagName('feGaussianBlur')[0];
const matrix = filter.getElementsByTagName('feColorMatrix')[0];
const html = document.getElementsByTagName('html')[0];
let render = 30;
let zoom = 1;
let speed = 0.01;
let offset = 0;
let color = 'red';
let drawing_diameter = 40;
let drawing_delay = 20;
let drawing_render = 50;
let flashlight_diameter = 300;
let flashlight_delay = 555;
let flashlight_render = 20;
let mask = 'unset';
let mask_target_name = "noise_text";
let mask_target = document.body;
let mask_blur = 'unset';
let mask_contrast = 'unset';
let mask_circle = 30;
let mask_custom = 'circle(30% at 50% 50%)';
let text_border_x, text_border_y, text_border_blur, text_border_color, text_border_depth;
let matrix_1 = '1 0 0 0 0';
let matrix_2 = '0 1 0 0 0';
let matrix_3 = '0 0 1 0 0';
let matrix_4 = '0 0 0 19 -9';
let x = Math.floor(Math.random() * (window.outerWidth + 1));
let y = Math.floor(Math.random() * (window.outerHeight + 1));
window.addEventListener("mousemove", (e) => (x = e.clientX, y = e.clientY));
// Инициализация инстанции выполнения
let instance;
// Инициализация инстанции выполнения рисования
let drawing_instance;
let drawing_timeouts = new Set;
function drawing() {
clearInterval(drawing_instance);
for (const drawing_timeout of drawing_timeouts) clearTimeout(drawing_timeout);
drawing_instance = setInterval(function () {
const __x = (x - mask_target.offsetLeft) / zoom;
const __y = (y - mask_target.offsetTop) / zoom;
drawing_timeouts.add(
setTimeout(() => {
for (let _y = 0; _y < layer.shell.height; _y += layer.block.height) {
// Перебор колонок
if (_y - drawing_diameter < __y && _y + drawing_diameter > __y) {
// Входит в диапазон по вертикали
for (let _x = 0; _x < layer.shell.width; _x += layer.block.width) {
// Перебор строк
if (_x - drawing_diameter < __x && _x + drawing_diameter > __x) {
// Входит в диапазон по горизонтали
layer.clean(_x, _y, offset, 0, 0.3, drawing_decay);
}
}
}
}
}, drawing_delay));
}, drawing_render);
}
// Инициализация инстанции выполнения фонаря
let flashlight_instance;
let flashlight_timeouts = new Set;
function flashlight() {
clearInterval(flashlight_instance);
for (const flashlight_timeout of flashlight_timeouts) clearTimeout(flashlight_timeout);
flashlight_instance = setInterval(() => {
const _x = (x - mask_target.offsetLeft) / zoom;
const _y = (y - mask_target.offsetTop) / zoom;
flashlight_timeouts.add(
setTimeout(() => mask_target.style.clipPath = `circle(${flashlight_diameter}px at ${_x}px ${_y}px)`, flashlight_delay)
);
}, flashlight_render);
}
function text_border() {
shadow = '';
for (let i = 0; i < text_border_depth; ++i) shadow += `${text_border_x}px ${text_border_y}px ${text_border_blur}px ${text_border_color}, `;
shadow = shadow.slice(0, -2);
if (text_border_x !== 0 || text_border_y !== 0 || text_border_blur !== 0) text.style.setProperty('--text-shadow', shadow);
else text.style.setProperty('--text-shadow', 'unset');
}
function matrix_value() {
matrix.setAttribute('values', matrix_1.length > 0 && matrix_2.length > 0 && matrix_3.length > 0 && matrix_4.length > 0
? `${matrix_1} ${matrix_2} ${matrix_3} ${matrix_4}`
: ''
);
}
function init() {
clearInterval(instance);
instance = setInterval(function () {
layer.dump();
drawing ? layer.interactive(offset += speed, color) : layer.generate(offset += speed, color);
}, render);
}
// Первичная инициализация
init();
window.addEventListener('resize', function (e) {
layer.init();
init()
}, true);
// Wallpaper Engine настройки
window.wallpaperPropertyListener = {
applyUserProperties: function (properties) {
// Text
if (properties.text) text.innerText = properties.text.value;
// Font
if (properties.font) text.style.setProperty('--font', properties.font.value);
// Font weight
if (properties.font_weight) text.style.setProperty('--font-weight', properties.font_weight.value * 100);
// Text color
if (properties.text_color) text.style.color = 'rgb(' + properties.text_color.value.split(' ').map(function (c) {
return Math.ceil(c * 255);
}) + ')';
// Text size
if (properties.text_size) text.style.fontSize = properties.text_size.value + 'rem';
// Text left offset (%)
if (properties.text_left) text.style.setProperty('--left', properties.text_left.value + '%');
// Text top offset (%)
if (properties.text_top) text.style.setProperty('--top', properties.text_top.value + '%');
// Text opacity (%)
if (properties.text_opacity) text.style.setProperty('--opacity', properties.text_opacity.value / 100);
// Text border X (px)
if (properties.text_border_x) {
text_border_x = properties.text_border_x.value;
text_border();
}
// Text border Y (px)
if (properties.text_border_y) {
text_border_y = properties.text_border_y.value;
text_border();
}
// Text border blur (px)
if (properties.text_border_blur) {
text_border_blur = properties.text_border_blur.value;
text_border();
}
// Text border depth
if (properties.text_border_depth) {
text_border_depth = properties.text_border_depth.value;
text_border();
}
// Text border color
if (properties.text_border_color) {
text_border_color = 'rgb(' + properties.text_border_color.value.split(' ').map(function (c) {
return Math.ceil(c * 255);
}) + ')';
text_border();
}
// Background color
if (properties.background) document.body.style.backgroundColor = 'rgb(' + properties.background.value.split(' ').map(function (c) {
return Math.ceil(c * 255);
}) + ')';
// Blocks width
if (properties.blocks_width) layer.block.width = properties.blocks_width.value;
// Blocks height
if (properties.blocks_height) layer.block.height = properties.blocks_height.value;
// Left offset (%)
if (properties.left) document.body.style.setProperty('--left', properties.left.value + '%');
// Top offset (%)
if (properties.top) document.body.style.setProperty('--top', properties.top.value + '%');
// Zoom
if (properties.zoom) {
zoom = properties.zoom.value;
document.body.style.setProperty('--zoom', zoom);
layer.init();
init()
}
// Render frequency (ms)
if (properties.render) {
render = properties.render.value;
init();
}
// Stick to edges
if (properties.stick) {
shell.style.setProperty('--scale', properties.stick.value);
};
// Blur
if (properties.blur) document.body.style.setProperty('--blur', properties.blur.value + 'px');
// Contrast
if (properties.contrast) document.body.style.setProperty('--contrast', properties.contrast.value);
// Noise blur
if (properties.noise_blur) blur.setAttribute('stdDeviation', properties.noise_blur.value);
// Speed
if (properties.speed) speed = properties.speed.value / 10000;
// Background color
if (properties.schemecolor) color = 'rgb(' + properties.schemecolor.value.split(' ').map(function (c) {
return Math.ceil(c * 255);
}) + ')';
// Drawing brush diameter
if (properties.drawing_diameter) {
drawing_diameter = properties.drawing_diameter.value / zoom;
drawing();
}
// Drawing decay
if (properties.drawing_decay) {
drawing_decay = properties.drawing_decay.value;
drawing();
}
// Drawing delay
if (properties.drawing_delay) {
drawing_delay = properties.drawing_delay.value;
drawing();
}
// Drawing render frequency
if (properties.drawing_render) {
drawing_render = properties.drawing_render.value;
drawing();
}
// Drawing
if (properties.drawing) {
if (properties.drawing.value) drawing();
else {
clearInterval(drawing_instance);
for (const drawing_timeout of drawing_timeouts) clearTimeout(drawing_timeout);
}
}
// Flashlight diameter
if (properties.flashlight_diameter) {
flashlight_diameter = properties.flashlight_diameter.value / zoom;
flashlight();
}
// Flashlight delay
if (properties.flashlight_delay) {
flashlight_delay = properties.flashlight_delay.value;
flashlight();
}
// Flashlight render frequency
if (properties.flashlight_render) {
flashlight_render = properties.flashlight_render.value;
flashlight();
}
// Mask: circle
if (properties.mask_circle) {
mask_circle = properties.mask_circle.value;
if (mask === 'circle') mask_target.style.clipPath = `circle(${mask_circle}% at 50% 50%)`;
}
// Mask: custom
if (properties.mask_custom) {
mask_custom = properties.mask_custom.value;
if (mask === 'custom') mask_target.style.clipPath = mask_custom;
}
// Mask target
if (properties.mask_target) {
mask_target_name = properties.mask_target.value;
shell.style.clipPath = text.style.clipPath = document.body.style.clipPath = 'unset';
if (mask_target_name === 'noise') {
html.style.setProperty('--blur', 'unset');
html.style.setProperty('--contrast', 'unset');
mask_target = shell;
}
else if (mask_target_name === 'text') {
html.style.setProperty('--blur', 'unset');
html.style.setProperty('--contrast', 'unset');
mask_target = text;
}
else if (mask_target_name === 'noise_text') {
html.style.setProperty('--blur', mask_blur + 'px');
html.style.setProperty('--contrast', mask_contrast);
mask_target = document.body;
}
if (mask === 'flashlight') flashlight();
}
// Mask blur
if (properties.mask_blur) {
html.style.setProperty('--contrast', mask_blur = mask !== 'unset' ? mask_blur + 'px' : 'unset');
}
// Mask blur
if (properties.mask_blur) {
html.style.setProperty('--contrast', mask_blur = mask !== 'unset' ? mask_blur + 'px' : 'unset');
}
// Mask contrast
if (properties.mask_contrast) {
html.style.setProperty('--contrast', mask_contrast = mask !== 'unset' ? properties.mask_contrast.value : 'unset');
}
// Mask
if (properties.mask) {
mask = properties.mask.value;
shell.style.clipPath = text.style.clipPath = document.body.style.clipPath = 'unset';
clearInterval(flashlight_instance);
for (const flashlight_timeout of flashlight_timeouts) clearTimeout(flashlight_timeout);
if (mask === 'flashlight') flashlight();
else if (mask === 'circle') shell.style.clipPath = `circle(${mask_circle}% at 50% 50%)`;
else if (mask === 'custom') shell.style.clipPath = mask_custom;
}
// Matrix 1 [r-g-b-a-w]
if (properties.matrix_1) {
matrix_1 = properties.matrix_1.value;
matrix_value();
}
// Matrix 2 [r-g-b-a-w]
if (properties.matrix_2) {
matrix_2 = properties.matrix_2.value;
matrix_value();
}
// Matrix 3 [r-g-b-a-w]
if (properties.matrix_3) {
matrix_3 = properties.matrix_3.value;
matrix_value();
}
// Matrix 4 [r-g-b-a-w]
if (properties.matrix_4) {
matrix_4 = properties.matrix_4.value;
matrix_value();
}
},
}
}
};
});
</script>
</body>
</html>