codepens/psychedelic-waves/dist/script.js

155 lines
4.5 KiB
JavaScript

class World {
constructor(width, height) {
this.renderer = new THREE.WebGLRenderer({
alpha: true,
antialias: true });
this.renderer.setPixelRatio(window.devicePixelRatio);
this.renderer.setSize(width, height);
this.container = document.getElementsByClassName("world")[0];
this.scene = new THREE.Scene();
this.width = width;
this.height = height;
this.aspectRatio = width / height;
this.fieldOfView = 50;
var nearPlane = .1;
var farPlane = 20000;
this.camera = new THREE.PerspectiveCamera(this.fieldOfView, this.aspectRatio, nearPlane, farPlane);
this.camera.position.z = 200;
this.container.appendChild(this.renderer.domElement);
this.timer = 0;
this.mousePos = { x: 0, y: 0 };
this.targetMousePos = { x: 0, y: 0 };
this.createPlane();
this.render();
}
createPlane() {
this.material = new THREE.RawShaderMaterial({
vertexShader: document.getElementById('vertexShader').textContent,
fragmentShader: document.getElementById('fragmentShader').textContent,
uniforms: {
uTime: { type: 'f', value: 0 },
uHue: { type: 'f', value: .5 },
uHueVariation: { type: 'f', value: 1 },
uGradient: { type: 'f', value: 1 },
uDensity: { type: 'f', value: 1 },
uDisplacement: { type: 'f', value: 1 },
uMousePosition: { type: 'v2', value: new THREE.Vector2(0.5, 0.5) } } });
this.planeGeometry = new THREE.PlaneGeometry(2, 2, 1, 1);
this.plane = new THREE.Mesh(this.planeGeometry, this.material);
this.scene.add(this.plane);
}
render() {
this.timer += parameters.speed;
this.plane.material.uniforms.uTime.value = this.timer;
this.mousePos.x += (this.targetMousePos.x - this.mousePos.x) * .1;
this.mousePos.y += (this.targetMousePos.y - this.mousePos.y) * .1;
if (this.plane) {
this.plane.material.uniforms.uMousePosition.value = new THREE.Vector2(this.mousePos.x, this.mousePos.y);
}
this.renderer.render(this.scene, this.camera);
}
loop() {
this.render();
requestAnimationFrame(this.loop.bind(this));
}
updateSize(w, h) {
this.renderer.setSize(w, h);
this.camera.aspect = w / h;
this.camera.updateProjectionMatrix();
}
mouseMove(mousePos) {
this.targetMousePos.x = mousePos.px;
this.targetMousePos.y = mousePos.py;
}}
;
document.addEventListener("DOMContentLoaded", domIsReady);
let mousePos = { x: 0, y: 0, px: 0, py: 0 };
let world;
let gui = new dat.GUI();
let parameters = {
speed: .2,
hue: .5,
hueVariation: 1,
gradient: .3,
density: .5,
displacement: .66 };
function domIsReady() {
world = new World(this.container, this.renderer, window.innerWidth, window.innerHeight);
window.addEventListener('resize', handleWindowResize, false);
document.addEventListener("mousemove", handleMouseMove, false);
handleWindowResize();
world.loop();
initGui();
}
var guiHue;
function initGui() {
gui.width = 250;
guiSpeed = gui.add(parameters, 'speed').min(.1).max(1).step(.01).name('speed');
guiHue = gui.add(parameters, 'hue').min(0).max(1).step(.01).name('hue');
guiVariation = gui.add(parameters, 'hueVariation').min(0).max(1).step(.01).name('hue variation');
//guiGradient = gui.add(parameters, 'gradient').min(0).max(1).step(.01).name('inner gradient');
guiDensity = gui.add(parameters, 'density').min(0).max(1).step(.01).name('density');
guiDisp = gui.add(parameters, 'displacement').min(0).max(1).step(.01).name('displacement');
guiHue.onChange(function (value) {
updateParameters();
});
guiVariation.onChange(function (value) {
updateParameters();
});
/*
guiGradient.onChange( function(value) {
updateParameters();
});
*/
guiDensity.onChange(function (value) {
updateParameters();
});
guiDisp.onChange(function (value) {
updateParameters();
});
updateParameters();
}
function updateParameters() {
world.plane.material.uniforms.uHue.value = parameters.hue;
world.plane.material.uniforms.uHueVariation.value = parameters.hueVariation;
//world.plane.material.uniforms.uGradient.value = parameters.gradient;
world.plane.material.uniforms.uDensity.value = parameters.density;
world.plane.material.uniforms.uDisplacement.value = parameters.displacement;
}
function handleWindowResize() {
world.updateSize(window.innerWidth, window.innerHeight);
}
function handleMouseMove(e) {
mousePos.x = e.clientX;
mousePos.y = e.clientY;
mousePos.px = mousePos.x / window.innerWidth;
mousePos.py = 1.0 - mousePos.y / window.innerHeight;
world.mouseMove(mousePos);
}