UNPKG

photo-sphere-viewer

Version:

A JavaScript library to display Photo Sphere panoramas

189 lines (154 loc) 6.11 kB
/*! * Photo Sphere Viewer 4.8.1 * @copyright 2014-2015 Jérémy Heleine * @copyright 2015-2022 Damien "Mistic" Sorel * @licence MIT (https://opensource.org/licenses/MIT) */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('three'), require('photo-sphere-viewer')) : typeof define === 'function' && define.amd ? define(['exports', 'three', 'photo-sphere-viewer'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.PhotoSphereViewer = global.PhotoSphereViewer || {}, global.PhotoSphereViewer.LittlePlanetAdapter = {}), global.THREE, global.PhotoSphereViewer)); })(this, (function (exports, three, photoSphereViewer) { 'use strict'; function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } photoSphereViewer.DEFAULTS.defaultLat = -Math.PI / 2; var euler = new three.Euler(); /** * @summary Adapter for equirectangular panoramas displayed with little planet effect * @memberof PSV.adapters * @extends PSV.adapters.AbstractAdapter */ var LittlePlanetAdapter = /*#__PURE__*/function (_EquirectangularAdapt) { _inheritsLoose(LittlePlanetAdapter, _EquirectangularAdapt); /** * @param {PSV.Viewer} psv */ function LittlePlanetAdapter(psv) { var _this; _this = _EquirectangularAdapt.call(this, psv) || this; _this.psv.prop.littlePlanet = true; _this.psv.on(photoSphereViewer.CONSTANTS.EVENTS.SIZE_UPDATED, _assertThisInitialized(_this)); _this.psv.on(photoSphereViewer.CONSTANTS.EVENTS.ZOOM_UPDATED, _assertThisInitialized(_this)); _this.psv.on(photoSphereViewer.CONSTANTS.EVENTS.POSITION_UPDATED, _assertThisInitialized(_this)); return _this; } /** * @override */ var _proto = LittlePlanetAdapter.prototype; _proto.supportsTransition = function supportsTransition() { return false; } /** * @override */ ; _proto.supportsPreload = function supportsPreload() { return true; } /** * @private */ ; _proto.handleEvent = function handleEvent(e) { /* eslint-disable */ switch (e.type) { case photoSphereViewer.CONSTANTS.EVENTS.SIZE_UPDATED: this.__setResolution(e.args[0]); break; case photoSphereViewer.CONSTANTS.EVENTS.ZOOM_UPDATED: this.__setZoom(); break; case photoSphereViewer.CONSTANTS.EVENTS.POSITION_UPDATED: this.__setPosition(e.args[0]); break; } /* eslint-enable */ } /** * @param {PSV.Size} size * @private */ ; _proto.__setResolution = function __setResolution(size) { this.uniforms.resolution.value = size.width / size.height; } /** * @private */ ; _proto.__setZoom = function __setZoom() { // mapping values are empirical this.uniforms.zoom.value = Math.max(0.1, three.MathUtils.mapLinear(this.psv.prop.vFov, 90, 30, 50, 2)); } /** * @param {PSV.Position} position * @private */ ; _proto.__setPosition = function __setPosition(position) { euler.set(Math.PI / 2 + position.latitude, 0, -Math.PI / 2 - position.longitude, 'ZYX'); this.uniforms.transform.value.makeRotationFromEuler(euler); } /** * @override */ ; _proto.createMesh = function createMesh() { var geometry = new three.PlaneBufferGeometry(20, 10).translate(0, 0, -1); // this one was copied from https://github.com/pchen66/panolens.js var material = new three.ShaderMaterial({ uniforms: { panorama: { value: new three.Texture() }, resolution: { value: 2.0 }, transform: { value: new three.Matrix4() }, zoom: { value: 10.0 }, opacity: { value: 1.0 } }, vertexShader: "\nvarying vec2 vUv;\n\nvoid main() {\n vUv = uv;\n gl_Position = vec4( position, 1.0 );\n}", fragmentShader: "\nuniform sampler2D panorama;\nuniform float resolution;\nuniform mat4 transform;\nuniform float zoom;\nuniform float opacity;\n\nvarying vec2 vUv;\n\nconst float PI = 3.1415926535897932384626433832795;\n\nvoid main() {\n vec2 position = -1.0 + 2.0 * vUv;\n position *= vec2( zoom * resolution, zoom * 0.5 );\n\n float x2y2 = position.x * position.x + position.y * position.y;\n vec3 sphere_pnt = vec3( 2. * position, x2y2 - 1. ) / ( x2y2 + 1. );\n sphere_pnt = vec3( transform * vec4( sphere_pnt, 1.0 ) );\n\n vec2 sampleUV = vec2(\n 1.0 - (atan(sphere_pnt.y, sphere_pnt.x) / PI + 1.0) * 0.5,\n (asin(sphere_pnt.z) / PI + 0.5)\n );\n\n gl_FragColor = texture2D( panorama, sampleUV );\n gl_FragColor.a *= opacity;\n}" }); this.uniforms = material.uniforms; return new three.Mesh(geometry, material); } /** * @override */ ; _proto.setTexture = function setTexture(mesh, textureData) { mesh.material.uniforms.panorama.value.dispose(); mesh.material.uniforms.panorama.value = textureData.texture; }; return LittlePlanetAdapter; }(photoSphereViewer.EquirectangularAdapter); LittlePlanetAdapter.id = 'little-planet'; LittlePlanetAdapter.supportsOverlay = false; exports.LittlePlanetAdapter = LittlePlanetAdapter; Object.defineProperty(exports, '__esModule', { value: true }); })); //# sourceMappingURL=little-planet.js.map