() => {
return {
modules: ['https://cdnjs.cloudflare.com/ajax/libs/three.js/84/three.min.js',
'https://cdn.rawgit.com/mrdoob/three.js/25bc88abaef7f2f9376b8bbdea28973aa4925629/examples/js/controls/OrbitControls.js',
'https://cdn.rawgit.com/mrdoob/three.js/6c7f000734f8579da37fb39e5c2e9e5e2dfb14f8/examples/js/Detector.js'
],
body: `
`,
console: true,
script: () => {
document.addEventListener("DOMContentLoaded", (e) => {
const webglEl = document.getElementById('sphere'),
width = window.innerWidth,
height = window.innerHeight,
panoramasArray = [
"https://res.cloudinary.com/dkcygpizo/image/upload/v1491862637/codepen/1_dtotv2.jpg",
"https://res.cloudinary.com/dkcygpizo/image/upload/v1491862643/codepen/4_yvn4cb.jpg",
"https://res.cloudinary.com/dkcygpizo/image/upload/v1491862642/codepen/5_ydhnc6.jpg"
];
let panoramaNumber = 0 /* Math.floor(Math.random()*panoramasArray.length)* /;
/* Creating the scene */
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, width / height, 1, 1100);
camera.position.x = 0.1;
const renderer = Detector.webgl ? new THREE.WebGLRenderer(): new THREE.CanvasRenderer();
renderer.setSize(width, height);
webglEl.appendChild(renderer.domElement);
const sphereMaterial = new THREE.MeshBasicMaterial();
sphereMaterial.map = new THREE.TextureLoader().setCrossOrigin("anonymous").load(panoramasArray[panoramaNumber]);
//sphereMaterial.map = new THREE.TextureLoader().load(panoramasArray[panoramaNumber]); // For local images
const sphereGeometry = new THREE.SphereGeometry(500, 60, 40);
const sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);
sphere.scale.x = -1;
scene.add(sphere);
/* Rendering & OrbitControls */
const controls = new THREE.OrbitControls(camera, webglEl);
controls.enablePan = false;
controls.enableZoom = false;
controls.autoRotate = true;
controls.autoRotateSpeed = 0.5;
controls.maxPolarAngle = 2; // Radians
controls.minPolarAngle = 1; // Radians
function render() {
controls.update();
requestAnimationFrame(render);
renderer.render(scene, camera);
}
render();
/* Add Controls */
let deltaCount = 0;
function onMouseWheel(e) {
e.preventDefault();
function mouseWheel() {
if (e.wheelDeltaY) {
// WebKit
camera.fov -= e.wheelDeltaY * 0.05;
} else if (e.wheelDelta) {
// Opera / IE9
camera.fov -= e.wheelDelta * 0.05;
} else if (e.detail) {
// Firefox
camera.fov += e.detail * 1.0;
}
camera.fov = Math.max(40, Math.min(100, camera.fov));
}
if (e.deltaY < 0) {
if (deltaCount < 6) {
mouseWheel();
deltaCount += 1;
}
} else {
if (deltaCount > 0) {
mouseWheel();
deltaCount -= 1;
}
}
camera.updateProjectionMatrix();
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}
document.addEventListener('mousewheel', onMouseWheel, false);
document.addEventListener('DOMMouseScroll', onMouseWheel, false);
window.addEventListener('resize', onWindowResize, false);
/* Switch & Zoom */
const switchBtn = document.querySelectorAll('.controls li[class*="switch"]'),
zoomBtn = document.querySelectorAll('.controls li[class*="zoom"]');
for (let i = 0; i < switchBtn.length; i++) {
switchBtn[i].onclick = (e) => {
let j = panoramasArray.length;
panoramaNumber = ~e.target.className.indexOf("controls__switch-next") ? (panoramaNumber + 1) % j: (panoramaNumber - 1) % j;
sphereMaterial.map = new THREE.TextureLoader().setCrossOrigin("anonymous").load(panoramasArray[Math.abs(panoramaNumber)]);
//sphereMaterial.map = new THREE.TextureLoader().load(panoramasArray[Math.abs(panoramaNumber)]); // For local images
};
}
for (let i = 0; i < zoomBtn.length; i++) {
zoomBtn[i].onclick = (e) => {
if (~e.target.className.indexOf("controls__zoom-in")) {
if (deltaCount < 6) {
camera.fov = Math.max(40, Math.min(100, camera.fov - 6));
deltaCount += 1;
}
} else {
if (deltaCount > 0) {
camera.fov = Math.max(40, Math.min(100, camera.fov + 6));
deltaCount -= 1;
}
}
camera.updateProjectionMatrix();
}
}
});
}
}
}