{"version":3,"sources":["src/index.ts","src/LittlePlanetAdapter.ts","src/shaders/littlePlanet.fragment.glsl","src/shaders/littlePlanet.vertex.glsl"],"sourcesContent":["import { DEFAULTS } from '@photo-sphere-viewer/core';\n\nDEFAULTS.defaultPitch = -Math.PI / 2;\n\nexport { LittlePlanetAdapter } from './LittlePlanetAdapter';\n","import type { EquirectangularAdapterConfig, Position, Size, TextureData, Viewer } from '@photo-sphere-viewer/core';\nimport { EquirectangularAdapter, events } from '@photo-sphere-viewer/core';\nimport { BufferGeometry, Euler, MathUtils, Matrix4, Mesh, PlaneGeometry, ShaderMaterial, Texture } from 'three';\nimport littlePlanetFragment from './shaders/littlePlanet.fragment.glsl';\nimport littlePlanetVertex from './shaders/littlePlanet.vertex.glsl';\n\ntype EquirectangularMesh = Mesh<BufferGeometry, ShaderMaterial>;\ntype EquirectangularTexture = TextureData<Texture, string>;\n\ntype ShaderUniforms = {\n    panorama: { value: Texture };\n    resolution: { value: number };\n    transform: { value: Matrix4 };\n    zoom: { value: number };\n    opacity: { value: number };\n};\n\nconst euler = new Euler();\n\n/**\n * Adapter for equirectangular panoramas displayed with little planet effect\n */\nexport class LittlePlanetAdapter extends EquirectangularAdapter {\n    static override readonly id = 'little-planet';\n    static override readonly VERSION = PKG_VERSION;\n    static override readonly supportsDownload = true;\n\n    private uniforms: ShaderUniforms;\n\n    constructor(viewer: Viewer, config?: EquirectangularAdapterConfig) {\n        super(viewer, config);\n\n        this.viewer.state.littlePlanet = true;\n    }\n\n    override init() {\n        super.init();\n\n        this.viewer.addEventListener(events.SizeUpdatedEvent.type, this);\n        this.viewer.addEventListener(events.ZoomUpdatedEvent.type, this);\n        this.viewer.addEventListener(events.PositionUpdatedEvent.type, this);\n    }\n\n    override destroy(): void {\n        this.viewer.removeEventListener(events.SizeUpdatedEvent.type, this);\n        this.viewer.removeEventListener(events.ZoomUpdatedEvent.type, this);\n        this.viewer.removeEventListener(events.PositionUpdatedEvent.type, this);\n\n        super.destroy();\n    }\n\n    override supportsTransition() {\n        return false;\n    }\n\n    override supportsPreload() {\n        return true;\n    }\n\n    /**\n     * @internal\n     */\n    handleEvent(e: Event) {\n        if (e instanceof events.SizeUpdatedEvent) {\n            this.__setResolution(e.size);\n        } else if (e instanceof events.ZoomUpdatedEvent) {\n            this.__setZoom();\n        } else if (e instanceof events.PositionUpdatedEvent) {\n            this.__setPosition(e.position);\n        }\n    }\n\n    override createMesh(): EquirectangularMesh {\n        const geometry = new PlaneGeometry(20, 10).translate(0, 0, -1) as PlaneGeometry;\n\n        const material = new ShaderMaterial({\n            uniforms: {\n                panorama: { value: new Texture() },\n                resolution: { value: 2.0 },\n                transform: { value: new Matrix4() },\n                zoom: { value: 10.0 },\n                opacity: { value: 1.0 },\n            } as ShaderUniforms,\n            vertexShader: littlePlanetVertex,\n            fragmentShader: littlePlanetFragment,\n        });\n\n        this.uniforms = material.uniforms as ShaderUniforms;\n\n        return new Mesh(geometry, material);\n    }\n\n    override setTexture(mesh: EquirectangularMesh, textureData: EquirectangularTexture) {\n        mesh.material.uniforms.panorama.value.dispose();\n        mesh.material.uniforms.panorama.value = textureData.texture;\n    }\n\n    private __setResolution(size: Size) {\n        this.uniforms.resolution.value = size.width / size.height;\n    }\n\n    private __setZoom() {\n        // mapping values are empirical\n        this.uniforms.zoom.value = Math.max(0.1, MathUtils.mapLinear(this.viewer.state.vFov, 90, 30, 50, 2));\n    }\n\n    private __setPosition(position: Position) {\n        euler.set(Math.PI / 2 + position.pitch, 0, -Math.PI / 2 - position.yaw, 'ZYX');\n\n        this.uniforms.transform.value.makeRotationFromEuler(euler);\n    }\n}\n","// this one was copied from https://github.com/pchen66/panolens.js/blob/master/src/shaders/StereographicShader.js\n\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}\n","varying vec2 vUv;\n\nvoid main() {\n    vUv = uv;\n    gl_Position = vec4( position, 1.0 );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,eAAyB;;;ACCzB,kBAA+C;AAC/C,mBAAwG;;;ACFxG;;;ACAA;;;AFiBA,IAAM,QAAQ,IAAI,mBAAM;AAKjB,IAAM,sBAAN,cAAkC,mCAAuB;AAAA,EAO5D,YAAY,QAAgB,QAAuC;AAC/D,UAAM,QAAQ,MAAM;AAEpB,SAAK,OAAO,MAAM,eAAe;AAAA,EACrC;AAAA,EAES,OAAO;AACZ,UAAM,KAAK;AAEX,SAAK,OAAO,iBAAiB,mBAAO,iBAAiB,MAAM,IAAI;AAC/D,SAAK,OAAO,iBAAiB,mBAAO,iBAAiB,MAAM,IAAI;AAC/D,SAAK,OAAO,iBAAiB,mBAAO,qBAAqB,MAAM,IAAI;AAAA,EACvE;AAAA,EAES,UAAgB;AACrB,SAAK,OAAO,oBAAoB,mBAAO,iBAAiB,MAAM,IAAI;AAClE,SAAK,OAAO,oBAAoB,mBAAO,iBAAiB,MAAM,IAAI;AAClE,SAAK,OAAO,oBAAoB,mBAAO,qBAAqB,MAAM,IAAI;AAEtE,UAAM,QAAQ;AAAA,EAClB;AAAA,EAES,qBAAqB;AAC1B,WAAO;AAAA,EACX;AAAA,EAES,kBAAkB;AACvB,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,GAAU;AAClB,QAAI,aAAa,mBAAO,kBAAkB;AACtC,WAAK,gBAAgB,EAAE,IAAI;AAAA,IAC/B,WAAW,aAAa,mBAAO,kBAAkB;AAC7C,WAAK,UAAU;AAAA,IACnB,WAAW,aAAa,mBAAO,sBAAsB;AACjD,WAAK,cAAc,EAAE,QAAQ;AAAA,IACjC;AAAA,EACJ;AAAA,EAES,aAAkC;AACvC,UAAM,WAAW,IAAI,2BAAc,IAAI,EAAE,EAAE,UAAU,GAAG,GAAG,EAAE;AAE7D,UAAM,WAAW,IAAI,4BAAe;AAAA,MAChC,UAAU;AAAA,QACN,UAAU,EAAE,OAAO,IAAI,qBAAQ,EAAE;AAAA,QACjC,YAAY,EAAE,OAAO,EAAI;AAAA,QACzB,WAAW,EAAE,OAAO,IAAI,qBAAQ,EAAE;AAAA,QAClC,MAAM,EAAE,OAAO,GAAK;AAAA,QACpB,SAAS,EAAE,OAAO,EAAI;AAAA,MAC1B;AAAA,MACA,cAAc;AAAA,MACd,gBAAgB;AAAA,IACpB,CAAC;AAED,SAAK,WAAW,SAAS;AAEzB,WAAO,IAAI,kBAAK,UAAU,QAAQ;AAAA,EACtC;AAAA,EAES,WAAW,MAA2B,aAAqC;AAChF,SAAK,SAAS,SAAS,SAAS,MAAM,QAAQ;AAC9C,SAAK,SAAS,SAAS,SAAS,QAAQ,YAAY;AAAA,EACxD;AAAA,EAEQ,gBAAgB,MAAY;AAChC,SAAK,SAAS,WAAW,QAAQ,KAAK,QAAQ,KAAK;AAAA,EACvD;AAAA,EAEQ,YAAY;AAEhB,SAAK,SAAS,KAAK,QAAQ,KAAK,IAAI,KAAK,uBAAU,UAAU,KAAK,OAAO,MAAM,MAAM,IAAI,IAAI,IAAI,CAAC,CAAC;AAAA,EACvG;AAAA,EAEQ,cAAc,UAAoB;AACtC,UAAM,IAAI,KAAK,KAAK,IAAI,SAAS,OAAO,GAAG,CAAC,KAAK,KAAK,IAAI,SAAS,KAAK,KAAK;AAE7E,SAAK,SAAS,UAAU,MAAM,sBAAsB,KAAK;AAAA,EAC7D;AACJ;AAzFa,oBACgB,KAAK;AADrB,oBAEgB,UAAU;AAF1B,oBAGgB,mBAAmB;;;ADvBhD,sBAAS,eAAe,CAAC,KAAK,KAAK;","names":["import_core"]}