for(let i = 0, element; element = document.querySelectorAll('input[type="range"]')[i++];) {
rangeSlider.create(element, {
polyfill: true
});
}
$(document).ready(function() {
let speedSlider = $('input[name="speed"]'),
spikesSlider = $('input[name="spikes"]'),
processingSlider = $('input[name="processing"]');
let $canvas = $('#blob canvas'),
canvas = $canvas[0],
renderer = new THREE.WebGLRenderer({
canvas: canvas,
context: canvas.getContext('webgl2'),
antialias: true,
alpha: true
}),
simplex = new SimplexNoise();
renderer.setSize($canvas.width(), $canvas.height());
renderer.setPixelRatio(window.devicePixelRatio || 1);
let scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(45, $canvas.width() / $canvas.height(), 0.1, 1000);
camera.position.z = 5;
let geometry = new THREE.SphereGeometry(.8, 128, 128);
let material = new THREE.MeshPhongMaterial({
color: 0xE4ECFA,
shininess: 100
});
let lightTop = new THREE.DirectionalLight(0xFFFFFF, .7);
lightTop.position.set(0, 500, 200);
lightTop.castShadow = true;
scene.add(lightTop);
let lightBottom = new THREE.DirectionalLight(0xFFFFFF, .25);
lightBottom.position.set(0, -500, 400);
lightBottom.castShadow = true;
scene.add(lightBottom);
let ambientLight = new THREE.AmbientLight(0x798296);
scene.add(ambientLight);
let sphere = new THREE.Mesh(geometry, material);
scene.add(sphere);
let update = () => {
let time = performance.now() * 0.00001 * speedSlider.val() * Math.pow(processingSlider.val(), 3),
spikes = spikesSlider.val() * processingSlider.val();
for(let i = 0; i < sphere.geometry.vertices.length; i++) {
let p = sphere.geometry.vertices[i];
p.normalize().multiplyScalar(1 + 0.3 * simplex.noise3D(p.x * spikes, p.y * spikes, p.z * spikes + time));
}
sphere.geometry.computeVertexNormals();
sphere.geometry.normalsNeedUpdate = true;
sphere.geometry.verticesNeedUpdate = true;
}
function animate() {
update();
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);
});