Нет описания

sliders.js 4.5KB

    //document.body.innerHTML = ""; var styleEl = document.createElement("style"); styleEl.textContent = ` .container .slider { margin-left: 1em; } `; document.head.appendChild(styleEl); function makeSlider(name, range, onChange) { var sliderContainerEl = document.createElement("div"); sliderContainerEl.className = "slider"; if (name) { var sliderLabelEl = document.createElement("label"); sliderLabelEl.textContent = name; sliderContainerEl.appendChild(sliderLabelEl); } var sliderEl = document.createElement("input"); sliderEl.type = "range"; sliderEl.min = range[0]; sliderEl.max = range[2]; sliderEl.step = Math.min(0.01, (range[2] - range[0]) / 100); sliderEl.value = range[1]; sliderEl.style.verticalAlign = "middle"; sliderEl.addEventListener("input", onChange); sliderContainerEl.appendChild(sliderEl); var sliderValueEl = document.createElement("span"); sliderValueEl.style = "display: inline-block; width: 3em;"; sliderValueEl.textContent = sliderEl.value; sliderContainerEl.appendChild(sliderValueEl); sliderEl.addEventListener("input", function() { sliderValueEl.textContent = sliderEl.value }); return sliderContainerEl; } function makeMultiSlider(name, ranges, onChange) { var containerEl = document.createElement("div"); containerEl.className = "container"; document.body.appendChild(containerEl); var labelEl = document.createElement("label"); labelEl.textContent = name; containerEl.appendChild(labelEl); var names = [".x", ".y", ".z", ".y"]; ranges.forEach(function(range, i) { containerEl.appendChild(makeSlider(names[i], range, function(ev) { onChange(ev, i); })); }); return containerEl; } function addSliders(parent, sliders) { sliders.forEach(function(slider) { switch (slider.type) { case "int": case "float": parent.appendChild(makeSlider(slider.name, slider.range, slider.onChange)); break; case "vec2": case "vec3": parent.appendChild(makeMultiSlider(slider.name, slider.range, slider.onChange)); break; default: throw new Error("unknown slider type " + slider.type); } }); } function initSliders(gl, program, sliders, onChange) { sliders.forEach(function(slider) { switch (slider.type) { case "int": slider.uniform = gl.getUniformLocation(program, slider.name); gl.uniform1f(slider.uniform, slider.range[1]); slider.onChange = function(ev) { gl.uniform1i(slider.uniform, parseInt(ev.target.value)); if (onChange) { onChange(ev, slider); } } break; case "float": slider.uniform = gl.getUniformLocation(program, slider.name); gl.uniform1f(slider.uniform, slider.range[1]); slider.onChange = function(ev) { gl.uniform1f(slider.uniform, parseFloat(ev.target.value)); if (onChange) { onChange(ev, slider); } } break; case "vec2": case "vec3": slider.values = slider.range.map(function(r) { return r[1] }); slider.uniform = gl.getUniformLocation(program, slider.name); if (slider.type == "vec2") { gl.uniform2f(slider.uniform, slider.values[0], slider.values[1]); } else if (slider.type == "vec3") { gl.uniform3f(slider.uniform, slider.values[0], slider.values[1], slider.values[2]); } else { throw new Error("unknown slider type " + slider.type); } slider.onChange = function(ev, i) { slider.values[i] = parseFloat(ev.target.value); if (slider.type == "vec2") { gl.uniform2f(slider.uniform, slider.values[0], slider.values[1]); } else if (slider.type == "vec3") { gl.uniform3f(slider.uniform, slider.values[0], slider.values[1], slider.values[2]); } else { throw new Error("unknown slider type " + slider.type); } if (onChange) { onChange(ev, slider, i); } } break; default: throw new Error("unknown slider type " + slider.type); } }); } //var sliders = [{"name":" iPosition","type":"vec3","range":[[0.01,0.52,1.03],[0.04,0.55,1.06],[0.07,0.58,1.09]]},{"name":" iResolution","type":"vec2","range":[[0.01,0.52,1.03],[0.04,0.55,1.06]]},{"name":"fancyness","type":"float","range":[0.01,0.52,1.03]}]; //addSliders(document.body, sliders);