227 lines
6.8 KiB
JavaScript
227 lines
6.8 KiB
JavaScript
function generateRotationSliders() {
|
|
let group = $('#rotate');
|
|
generateSlider(["X", "Y", "Z", "X-Inc", "Y-Inc", "Z-Inc"], 0, 360, 0, group, "rotate");
|
|
generateCheckBox(["by Beat"], true, group, "rotate");
|
|
}
|
|
|
|
function generateTranslateSliders() {
|
|
let group = $('#translate');
|
|
generateSlider(["X", "Y", "Z"], -1, 1, 0, group, "translate");
|
|
}
|
|
|
|
function generateColorSliders() {
|
|
let group = $('#color');
|
|
generateSlider(["R", "G", "B"], 0, 255, 125, group, "color");
|
|
generateCheckBox(["by Beat"], true, group, "color");
|
|
}
|
|
|
|
function generateWorldSliders() {
|
|
let group = $('#world');
|
|
generateSlider(["LightPos-X", "LightPos-Y", "LightPos-Z"], -100, 100, 0, group, "light");
|
|
generateSlider(["Light"], 0, 1, 0.3, group, "light");
|
|
}
|
|
|
|
function generateDrawSliders() {
|
|
let group = $('#draw'),
|
|
g = "drawMode"
|
|
generateSlider(["DrawMode"], 0, 6, 0, group, g);
|
|
generateSlider(["Form"], 0, 4, 0, group, g);
|
|
generateSlider(["Radius"], 20, 1500, 500, group, g);
|
|
generateSlider(["Total"], 20, 250, 50, group, g);
|
|
generateSlider(["PointSize"], 1, 10, 2, group, g, .2);
|
|
generateSlider(["Smoothing"], 0, 100, 80, group, g, 1);
|
|
generateSlider(["Steps"], 256, 2048, 512, group, g, 16);
|
|
generateCheckBox(["Dirty"], false, group, g)
|
|
}
|
|
|
|
function setRotations(changedEl) {
|
|
let group = $('#rotate');
|
|
let items = ["#X", "#Y", "#Z"];
|
|
for (let i in items) {
|
|
let el = $(items[i], group);
|
|
if (el === changedEl) {
|
|
sphereObject.rotationRaw[i] = getValue(el)
|
|
}
|
|
}
|
|
items = ["#X-Inc", "#Y-Inc", "#Z-Inc"];
|
|
for (let i in items) {
|
|
let el = $(items[i], group);
|
|
if (el === changedEl) {
|
|
sphereObject.rotateInc[i] = getValue(el) / 360;
|
|
}
|
|
}
|
|
|
|
sphereObject.rotateByBeat = $('#rotateby-Beat', group).checked;
|
|
}
|
|
|
|
function setColors() {
|
|
let group = $('#color');
|
|
sphereObject.color.r = getValue($('#R', group)) / 255;
|
|
sphereObject.color.g = getValue($('#G', group)) / 255;
|
|
sphereObject.color.b = getValue($('#B', group)) / 255;
|
|
|
|
sphereObject.colorByBeat = $('#colorby-Beat', group).checked;
|
|
}
|
|
|
|
function setWorld() {
|
|
let group = $('#world');
|
|
sphereObject.lightPos[0] = getValue($('#LightPos-X', group));
|
|
sphereObject.lightPos[1] = getValue($('#LightPos-Y', group));
|
|
sphereObject.lightPos[2] = getValue($('#LightPos-Z', group));
|
|
sphereObject.light = getValue($('#Light', group));
|
|
}
|
|
|
|
function setDraw() {
|
|
let group = $('#draw');
|
|
sphereObject.drawMode = getValue($('#DrawMode', group));
|
|
sphereObject.sphereMode = getValue($('#Form', group));
|
|
sphereObject.radius = getValue($('#Radius', group));
|
|
sphereObject.total = getValue($('#Total', group));
|
|
sphereObject.pointSize = getValue($('#PointSize', group));
|
|
sphereObject.steps = getValue($('#Steps', group));
|
|
sphereObject.dirtyMode = $('#drawModeDirty', group).checked;
|
|
analyser.smoothingTimeConstant = getValue($('#Smoothing', group)) / 100;
|
|
}
|
|
|
|
function setTranslate() {
|
|
let group = $('#translate');
|
|
let items = ["#X", "#Y", "#Z"];
|
|
for (let i in items) {
|
|
sphereObject.translate[i] = getValue($(items[i], group))
|
|
}
|
|
}
|
|
|
|
function generateSlider(fromList, min, max, value, appendTo, group, stepSize) {
|
|
for (let i = 0; i < fromList.length; i++) {
|
|
let label = create("label", fromList[i]);
|
|
let reset = create("button", "d");
|
|
let range = create("input");
|
|
range.type = "range";
|
|
range.min = min;
|
|
range.max = max;
|
|
range.value = value;
|
|
range.id = fromList[i];
|
|
range.step = max === 1 ? .01 : (stepSize || 1);
|
|
range.dataset.group = group;
|
|
range.dataset.value = value;
|
|
let item = create("group-input");
|
|
append(item, [label, range, reset])
|
|
appendTo.appendChild(item);
|
|
}
|
|
}
|
|
|
|
function generateCheckBox(fromList, defaultValue, appendTo, group) {
|
|
for (let i = 0; i < fromList.length; i++) {
|
|
let label = create("label", fromList[i])
|
|
let checkbox = create("input");
|
|
checkbox.type = "checkbox";
|
|
checkbox.checked = defaultValue === true;
|
|
checkbox.dataset.group = group;
|
|
checkbox.id = group + fromList[i].split(" ").join("-");
|
|
let item = create("group-input");
|
|
append(item, [label, createSwitch(checkbox)])
|
|
appendTo.appendChild(item);
|
|
}
|
|
}
|
|
|
|
function createSwitch(checkbox) {
|
|
let swi = create("switch");
|
|
let label = create("label");
|
|
label.setAttribute("for", checkbox.id);
|
|
append(swi, [checkbox, label]);
|
|
return swi;
|
|
}
|
|
|
|
function changeHandler(el) {
|
|
let d = el.dataset.group;
|
|
if (d === "rotate") {
|
|
setRotations(el);
|
|
} else if (d === "translate") {
|
|
setTranslate();
|
|
} else if (d === "color") {
|
|
setColors();
|
|
} else if (d === "light") {
|
|
setWorld();
|
|
} else if (d === "drawMode") {
|
|
setDraw();
|
|
}
|
|
saveConfig();
|
|
}
|
|
|
|
document.body.addDelegatedEventListener('input', 'group-input input', (ev, el) => {
|
|
changeHandler(el);
|
|
})
|
|
|
|
document.body.addDelegatedEventListener('click', 'group-input button', (ev, el) => {
|
|
let input = $('input', el.parentNode);
|
|
input.value = input.dataset.value;
|
|
changeHandler(input);
|
|
});
|
|
|
|
function getValue(slider) {
|
|
try {
|
|
return parseFloat(slider.value);
|
|
} catch (e) {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
$('.settings-icon').addEventListener('click', function () {
|
|
$('.off-can').classList.toggle("closed");
|
|
$('.settings-icon').classList.toggle("open");
|
|
})
|
|
|
|
window.addEventListener('keyup', e => {
|
|
if (e.key === 'F11') {
|
|
c.requestFullscreen();
|
|
return;
|
|
}
|
|
if (e.key === 'Escape') {
|
|
if (document.fullscreenElement) {
|
|
document.exitFullscreen().then(console.log);
|
|
}
|
|
}
|
|
if (e.key === 'p') {
|
|
audioFile.play();
|
|
}
|
|
if (e.key === 's') {
|
|
audioFile.pause();
|
|
}
|
|
});
|
|
|
|
function saveConfig() {
|
|
localStorage.setItem('config-sphere', JSON.stringify(sphereObject));
|
|
}
|
|
|
|
function loadConfig() {
|
|
let item = localStorage.getItem('config-sphere');
|
|
if (item && item !== "") {
|
|
sphereObject = JSON.parse(item);
|
|
}
|
|
}
|
|
|
|
let uploadField = $('#upload');
|
|
let audioFile = new Audio();
|
|
let lastSong = null;
|
|
uploadField.addEventListener('change', e => {
|
|
let file = uploadField.files[0];
|
|
if (file && file.type.indexOf('audio') !== -1 && file.name.match(".m3u") === null && file.name.match(".wma") === null) {
|
|
if (lastSong) {
|
|
URL.revokeObjectURL(lastSong);
|
|
}
|
|
audioFile.src = URL.createObjectURL(file);
|
|
document.title = file.name;
|
|
lastSong = audioFile.src;
|
|
createView();
|
|
}
|
|
})
|
|
|
|
$('#play').addEventListener('click', e => {
|
|
if (audioFile.src !== "") {
|
|
c.requestFullscreen().then(r => {
|
|
setTimeout(x => {
|
|
audioFile.play();
|
|
}, 1000)
|
|
});
|
|
}
|
|
}) |