// document.addEventListener("click", function() { // var documentElement = document.documentElement; // if (documentElement.requestFullscreen) { // documentElement.requestFullscreen() // } else { // if (documentElement.mozRequestFullScreen) { // documentElement.mozRequestFullScreen() // } else { // if (documentElement.webkitRequestFullScreen) { // documentElement.webkitRequestFullScreen() // } // } // } // }); var config = { percent: 0, lat: 0, lng: 0, segX: 14, segY: 12, zoom: 0, isHaloVisible: true, autoSpin: true, diffuse: "./img/timg.jpg", halo: "./img/halo.png", }, stats, imgs, preloader, preloadPercent, globeDoms, vertices, globe, globeContainer, globeHalo, pixelExpandOffset = 1.5, rX = 0, rY = 0, rZ = 0, sinRX, sinRY, sinRZ, cosRX, cosRY, cosRZ, dragX, dragY, dragLat, dragLng, isMouseDown = false, isTweening = false, tick = 1, transformStyleName = PerspectiveTransform.transformStyleName; function regenerateGlobe() { var dom, domStyle; var x, y; globeDoms = []; while (dom = globeContainer.firstChild) { globeContainer.removeChild(dom) } var segX = config.segX; var segY = config.segY; var diffuseImgBackgroundStyle = "url(" + config.diffuse + ")"; var segWidth = 1600 / segX | 0; var segHeight = 800 / segY | 0; vertices = []; var verticesRow; var radius = (360) / 2; var phiStart = 0; var phiLength = Math.PI * 2; var thetaStart = 0; var thetaLength = Math.PI; for (y = 0; y <= segY; y++) { verticesRow = []; for (x = 0; x <= segX; x++) { var u = x / segX; var v = 0.05 + y / segY * (1 - 0.1); var vertex = { x: -radius * Math.cos(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength), y: -radius * Math.cos(thetaStart + v * thetaLength), z: radius * Math.sin(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength), phi: phiStart + u * phiLength, theta: thetaStart + v * thetaLength }; verticesRow.push(vertex) } vertices.push(verticesRow) } for (y = 0; y < segY; ++y) { for (x = 0; x < segX; ++x) { dom = document.createElement("div"); domStyle = dom.style; domStyle.position = "absolute"; domStyle.width = segWidth + "px"; domStyle.height = segHeight + "px"; domStyle.overflow = "hidden"; domStyle[PerspectiveTransform.transformOriginStyleName] = "0 0"; domStyle.backgroundImage = diffuseImgBackgroundStyle; dom.perspectiveTransform = new PerspectiveTransform(dom, segWidth, segHeight); dom.topLeft = vertices[y][x]; dom.topRight = vertices[y][x + 1]; dom.bottomLeft = vertices[y + 1][x]; dom.bottomRight = vertices[y + 1][x + 1]; domStyle.backgroundPosition = (-segWidth * x) + "px " + (-segHeight * y) + "px"; globeContainer.appendChild(dom); globeDoms.push(dom) } } } function clamp(x, min, max) { return x < min ? min : x > max ? max : x } function clampLng(lng) { return ((lng + 180) % 360) - 180 } function render() { if (config.autoSpin && !isMouseDown && !isTweening) { config.lng = clampLng(config.lng - 0.2) } rX = config.lat / 180 * Math.PI; rY = (clampLng(config.lng) - 270) / 180 * Math.PI; globeHalo.style.display = config.isHaloVisible ? "block" : "none"; var ratio = Math.pow(config.zoom, 1.5); pixelExpandOffset = 1.5 + (ratio) * -1.25; ratio = 1 + ratio * 3; globe.style[transformStyleName] = "scale3d(" + ratio + "," + ratio + ",1)"; ratio = 1 + Math.pow(config.zoom, 3) * 0.3; transformGlobe() } function loop() { requestAnimationFrame(loop); render() } function rotate(vertex, x, y, z) { x0 = x * cosRY - z * sinRY; z0 = z * cosRY + x * sinRY; y0 = y * cosRX - z0 * sinRX; z0 = z0 * cosRX + y * sinRX; var offset = 1 + (z0 / 4000); x1 = x0 * cosRZ - y0 * sinRZ; y0 = y0 * cosRZ + x0 * sinRZ; vertex.px = x1 * offset; vertex.py = y0 * offset } function expand(v1, v2) { var x = v2.px - v1.px, y = v2.py - v1.py, det = x * x + y * y, idet; if (det === 0) { v1.tx = v1.px; v1.ty = v1.py; v2.tx = v2.px; v2.ty = v2.py; return } idet = pixelExpandOffset / Math.sqrt(det); x *= idet; y *= idet; v2.tx = v2.px + x; v2.ty = v2.py + y; v1.tx = v1.px - x; v1.ty = v1.py - y } function transformGlobe() { var dom, perspectiveTransform; var x, y, v1, v2, v3, v4, vertex, verticesRow, i, len; if (tick ^= 1) { sinRY = Math.sin(rY); sinRX = Math.sin(-rX); sinRZ = Math.sin(rZ); cosRY = Math.cos(rY); cosRX = Math.cos(-rX); cosRZ = Math.cos(rZ); var segX = config.segX; var segY = config.segY; for (y = 0; y <= segY; y++) { verticesRow = vertices[y]; for (x = 0; x <= segX; x++) { rotate(vertex = verticesRow[x], vertex.x, vertex.y, vertex.z) } } for (y = 0; y < segY; y++) { for (x = 0; x < segX; x++) { dom = globeDoms[x + segX * y]; v1 = dom.topLeft; v2 = dom.topRight; v3 = dom.bottomLeft; v4 = dom.bottomRight; expand(v1, v2); expand(v2, v3); expand(v3, v4); expand(v4, v1); perspectiveTransform = dom.perspectiveTransform; perspectiveTransform.topLeft.x = v1.tx; perspectiveTransform.topLeft.y = v1.ty; perspectiveTransform.topRight.x = v2.tx; perspectiveTransform.topRight.y = v2.ty; perspectiveTransform.bottomLeft.x = v3.tx; perspectiveTransform.bottomLeft.y = v3.ty; perspectiveTransform.bottomRight.x = v4.tx; perspectiveTransform.bottomRight.y = v4.ty; perspectiveTransform.hasError = perspectiveTransform.checkError(); if (!(perspectiveTransform.hasError = perspectiveTransform.checkError())) { perspectiveTransform.calc() } } } } else { for (i = 0, len = globeDoms.length; i < len; i++) { perspectiveTransform = globeDoms[i].perspectiveTransform; if (!perspectiveTransform.hasError) { perspectiveTransform.update() } else { perspectiveTransform.style[transformStyleName] = "translate3d(-8192px, 0, 0)" } } } } function init(ref) { globe = document.querySelector(".planet-globe"); globeContainer = document.querySelector(".planet-globe-doms-container"); globeHalo = document.querySelector(".planet-globe-halo"); globeHalo.style.backgroundImage = "url(" + config.halo + ")"; regenerateGlobe(); loop() } init();