{"version":3,"sources":["../src/index.ts","../src/data/constants.ts","../src/utils/index.ts","../src/utils/math.ts","../src/utils/browser.ts","../src/utils/misc.ts","../src/utils/psv.ts","../src/PSVError.ts","../src/utils/Animation.ts","../src/utils/Dynamic.ts","../src/utils/MultiDynamic.ts","../src/utils/PressHandler.ts","../src/utils/Slider.ts","../src/events.ts","../src/lib/TypedEventTarget.ts","../src/adapters/AbstractAdapter.ts","../src/adapters/EquirectangularAdapter.ts","../src/data/system.ts","../src/adapters/interpolationWorker.ts","../src/components/AbstractComponent.ts","../src/buttons/AbstractButton.ts","../src/buttons/CustomButton.ts","../src/buttons/DescriptionButton.ts","../src/buttons/DownloadButton.ts","../src/buttons/FullscreenButton.ts","../src/buttons/MenuButton.ts","../src/buttons/AbstractMoveButton.ts","../src/buttons/MoveDownButton.ts","../src/buttons/MoveLeftButton.ts","../src/buttons/MoveRightButton.ts","../src/buttons/MoveUpButton.ts","../src/buttons/AbstractZoomButton.ts","../src/buttons/ZoomInButton.ts","../src/buttons/ZoomOutButton.ts","../src/buttons/ZoomRangeButton.ts","../src/data/config.ts","../src/plugins/AbstractPlugin.ts","../src/components/NavbarCaption.ts","../src/components/Navbar.ts","../src/components/Loader.ts","../src/components/Notification.ts","../src/components/Overlay.ts","../src/components/Panel.ts","../src/components/Tooltip.ts","../src/data/cache.ts","../src/services/DataHelper.ts","../src/services/AbstractService.ts","../src/services/EventsHandler.ts","../src/services/Renderer.ts","../src/services/TextureLoader.ts","../src/services/ViewerDynamics.ts","../src/services/ViewerState.ts","../src/Viewer.ts"],"sourcesContent":["import { Cache, ColorManagement } from 'three';\nimport * as CONSTANTS from './data/constants';\nimport * as utils from './utils';\nimport * as events from './events';\n\nCache.enabled = false;\n// https://discourse.threejs.org/t/updates-to-color-management-in-three-js-r152/50791\nColorManagement.enabled = false;\n\nexport type { AdapterConstructor } from './adapters/AbstractAdapter';\nexport type { EquirectangularAdapterConfig } from './adapters/EquirectangularAdapter';\nexport type { ButtonConfig, ButtonConstructor } from './buttons/AbstractButton';\nexport type { Tooltip, TooltipConfig, TooltipPosition } from './components/Tooltip';\nexport type { Loader } from './components/Loader';\nexport type { Navbar } from './components/Navbar';\nexport type { Notification, NotificationConfig } from './components/Notification';\nexport type { Overlay, OverlayConfig } from './components/Overlay';\nexport type { Panel, PanelConfig } from './components/Panel';\nexport type { TypedEventTarget } from './lib/TypedEventTarget';\nexport type { PluginConstructor } from './plugins/AbstractPlugin';\nexport type { DataHelper } from './services/DataHelper';\nexport type { Renderer, CustomRenderer } from './services/Renderer';\nexport type { TextureLoader } from './services/TextureLoader';\nexport type { ViewerState } from './services/ViewerState';\n\nexport { AbstractAdapter } from './adapters/AbstractAdapter';\nexport { EquirectangularAdapter } from './adapters/EquirectangularAdapter';\nexport { AbstractButton } from './buttons/AbstractButton';\nexport { AbstractComponent } from './components/AbstractComponent';\nexport { registerButton } from './components/Navbar';\nexport { DEFAULTS } from './data/config';\nexport { SYSTEM } from './data/system';\nexport { TypedEvent } from './lib/TypedEventTarget';\nexport { AbstractPlugin, AbstractConfigurablePlugin } from './plugins/AbstractPlugin';\nexport { PSVError } from './PSVError';\nexport { Viewer } from './Viewer';\nexport * from './model';\nexport { CONSTANTS, events, utils };\n\n/** @internal */\nimport './styles/index.scss';\n","import arrow from '../icons/arrow.svg';\nimport close from '../icons/close.svg';\nimport download from '../icons/download.svg';\nimport fullscreenIn from '../icons/fullscreen-in.svg';\nimport fullscreenOut from '../icons/fullscreen-out.svg';\nimport info from '../icons/info.svg';\nimport menu from '../icons/menu.svg';\nimport zoomIn from '../icons/zoom-in.svg';\nimport zoomOut from '../icons/zoom-out.svg';\n\n/**\n * Default duration of the transition between panoramas\n */\nexport const DEFAULT_TRANSITION = 1500;\n\n/**\n * Minimum duration of the animations created with {@link Viewer#animate}\n */\nexport const ANIMATION_MIN_DURATION = 500;\n\n/**\n * Number of pixels bellow which a mouse move will be considered as a click\n */\nexport const MOVE_THRESHOLD = 4;\n\n/**\n * Delay in milliseconds between two clicks to consider a double click\n */\nexport const DBLCLICK_DELAY = 300;\n\n/**\n * Delay in milliseconds to emulate a long touch\n */\nexport const LONGTOUCH_DELAY = 500;\n\n/**\n * Delay in milliseconds to for the two fingers overlay to appear\n */\nexport const TWOFINGERSOVERLAY_DELAY = 100;\n\n/**\n * Duration in milliseconds of the \"ctrl zoom\" overlay\n */\nexport const CTRLZOOM_TIMEOUT = 2000;\n\n/**\n * Duration of the mouse position history used to compute inertia\n */\nexport const INERTIA_WINDOW = 300;\n\n/**\n * Radius of the SphereGeometry, Half-length of the BoxGeometry\n */\nexport const SPHERE_RADIUS = 10;\n\n/**\n * Property name added to viewer element\n */\nexport const VIEWER_DATA = 'photoSphereViewer';\n\n/**\n * CSS class that must be applied on elements whose mouse events must not bubble to the viewer itself\n */\nexport const CAPTURE_EVENTS_CLASS = 'psv--capture-event';\n\n/**\n * Actions available for {@link ViewerConfig['keyboard']} configuration\n */\nexport enum ACTIONS {\n ROTATE_UP = 'ROTATE_UP',\n ROTATE_DOWN = 'ROTATE_DOWN',\n ROTATE_RIGHT = 'ROTATE_RIGHT',\n ROTATE_LEFT = 'ROTATE_LEFT',\n ZOOM_IN = 'ZOOM_IN',\n ZOOM_OUT = 'ZOOM_OUT',\n}\n\n/**\n * Internal identifiers for various stuff\n * @internal\n */\nexport const IDS = {\n MENU: 'menu',\n TWO_FINGERS: 'twoFingers',\n CTRL_ZOOM: 'ctrlZoom',\n ERROR: 'error',\n DESCRIPTION: 'description',\n};\n\n/**\n * Subset of keyboard codes\n */\nexport const KEY_CODES = {\n Enter: 'Enter',\n Control: 'Control',\n Escape: 'Escape',\n Space: ' ',\n PageUp: 'PageUp',\n PageDown: 'PageDown',\n ArrowLeft: 'ArrowLeft',\n ArrowUp: 'ArrowUp',\n ArrowRight: 'ArrowRight',\n ArrowDown: 'ArrowDown',\n Delete: 'Delete',\n Plus: '+',\n Minus: '-',\n};\n\n/**\n * Collection of SVG icons\n */\nexport const ICONS = {\n arrow,\n close,\n download,\n fullscreenIn,\n fullscreenOut,\n info,\n menu,\n zoomIn,\n zoomOut,\n};\n\n/**\n * Collection of easing functions\n * @link https://gist.github.com/frederickk/6165768\n */\n// @formatter:off\n// prettier-ignore\nexport const EASINGS: Record number> = {\n linear: (t: number) => t,\n\n inQuad: (t: number) => t * t,\n outQuad: (t: number) => t * (2 - t),\n inOutQuad: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n\n inCubic: (t: number) => t * t * t,\n outCubic: (t: number) => --t * t * t + 1,\n inOutCubic: (t: number) => (t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1),\n\n inQuart: (t: number) => t * t * t * t,\n outQuart: (t: number) => 1 - --t * t * t * t,\n inOutQuart: (t: number) => (t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t),\n\n inQuint: (t: number) => t * t * t * t * t,\n outQuint: (t: number) => 1 + --t * t * t * t * t,\n inOutQuint: (t: number) => (t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t),\n\n inSine: (t: number) => 1 - Math.cos(t * (Math.PI / 2)),\n outSine: (t: number) => Math.sin(t * (Math.PI / 2)),\n inOutSine: (t: number) => 0.5 - 0.5 * Math.cos(Math.PI * t),\n\n inExpo: (t: number) => Math.pow(2, 10 * (t - 1)),\n outExpo: (t: number) => 1 - Math.pow(2, -10 * t),\n inOutExpo: (t: number) => ((t = t * 2 - 1) < 0 ? 0.5 * Math.pow(2, 10 * t) : 1 - 0.5 * Math.pow(2, -10 * t)),\n\n inCirc: (t: number) => 1 - Math.sqrt(1 - t * t),\n outCirc: (t: number) => Math.sqrt(1 - (t - 1) * (t - 1)),\n inOutCirc: (t: number) => (t *= 2) < 1 ? 0.5 - 0.5 * Math.sqrt(1 - t * t) : 0.5 + 0.5 * Math.sqrt(1 - (t -= 2) * t),\n};\n// @formatter:on\n","export * from './browser';\nexport * from './math';\nexport * from './misc';\nexport * from './psv';\n\nexport * from './Animation';\nexport * from './Dynamic';\nexport * from './MultiDynamic';\nexport * from './PressHandler';\nexport * from './Slider';\n","import { Point, Position } from '../model';\n\n/**\n * Ensures a value is within 0 and `max` by wrapping max to 0\n */\nexport function wrap(value: number, max: number): number {\n let result = value % max;\n\n if (result < 0) {\n result += max;\n }\n\n return result;\n}\n\n/**\n * Computes the sum of an array\n */\nexport function sum(array: number[]): number {\n return array.reduce((a, b) => a + b, 0);\n}\n\n/**\n * Computes the distance between two points\n */\nexport function distance(p1: Point, p2: Point): number {\n return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));\n}\n\n/**\n * Computes the angle wet ween two points\n */\nexport function angle(p1: Point, p2: Point): number {\n return Math.atan2(p2.y - p1.y, p2.x - p1.x);\n}\n\n/**\n * Compute the shortest offset between two angles on a sphere\n */\nexport function getShortestArc(from: number, to: number): number {\n const candidates = [\n 0, // direct\n Math.PI * 2, // clock-wise cross zero\n -Math.PI * 2, // counter-clock-wise cross zero\n ];\n\n return candidates.reduce((value, candidate) => {\n const newCandidate = to - from + candidate;\n return Math.abs(newCandidate) < Math.abs(value) ? newCandidate : value;\n }, Infinity);\n}\n\n/**\n * Computes the angle between the current position and a target position\n */\nexport function getAngle(position1: Position, position2: Position): number {\n // prettier-ignore\n return Math.acos(\n Math.cos(position1.pitch)\n * Math.cos(position2.pitch) \n * Math.cos(position1.yaw - position2.yaw) \n + Math.sin(position1.pitch) \n * Math.sin(position2.pitch)\n );\n}\n\n/**\n * Returns the distance between two points on a sphere of radius one\n * @link http://www.movable-type.co.uk/scripts/latlong.html\n */\nexport function greatArcDistance([yaw1, pitch1]: [number, number], [yaw2, pitch2]: [number, number]): number {\n // if yaw delta is > PI, apply an offset to only consider the shortest arc\n if (yaw1 - yaw2 > Math.PI) {\n yaw1 -= 2 * Math.PI;\n } else if (yaw1 - yaw2 < -Math.PI) {\n yaw1 += 2 * Math.PI;\n }\n const x = (yaw2 - yaw1) * Math.cos((pitch1 + pitch2) / 2);\n const y = pitch2 - pitch1;\n return Math.sqrt(x * x + y * y);\n}\n","import { Point } from '../model';\nimport { angle, distance } from './math';\n\n/**\n * Get an element in the page by an unknown selector\n */\nexport function getElement(selector: string | HTMLElement): HTMLElement {\n if (typeof selector === 'string') {\n return selector.match(/^[a-z]/i) ? document.getElementById(selector) : document.querySelector(selector);\n } else {\n return selector;\n }\n}\n\n/**\n * Toggles a CSS class\n */\nexport function toggleClass(element: Element, className: string, active?: boolean) {\n if (active === undefined) {\n element.classList.toggle(className);\n } else if (active) {\n element.classList.add(className);\n } else if (!active) {\n element.classList.remove(className);\n }\n}\n\n/**\n * Adds one or several CSS classes to an element\n */\nexport function addClasses(element: Element, className: string) {\n element.classList.add(...className.split(' '));\n}\n\n/**\n * Removes one or several CSS classes to an element\n */\nexport function removeClasses(element: Element, className: string) {\n element.classList.remove(...className.split(' '));\n}\n\n/**\n * Searches if an element has a particular parent at any level including itself\n */\nexport function hasParent(el: HTMLElement, parent: Element): boolean {\n let test: HTMLElement | null = el;\n\n do {\n if (test === parent) {\n return true;\n }\n test = test.parentElement;\n } while (test);\n\n return false;\n}\n\n/**\n * Gets the closest parent (can by itself)\n */\nexport function getClosest(el: HTMLElement, selector: string): HTMLElement | null {\n // When el is document or window, the matches does not exist\n if (!el?.matches) {\n return null;\n }\n\n let test: HTMLElement | null = el;\n\n do {\n if (test.matches(selector)) {\n return test;\n }\n test = test.parentElement;\n } while (test);\n\n return null;\n}\n\n/**\n * Gets the position of an element in the viewer without reflow\n * @description Will gives the same result as getBoundingClientRect() as soon as there are no CSS transforms\n */\nexport function getPosition(el: HTMLElement): Point {\n let x = 0;\n let y = 0;\n let test: HTMLElement | null = el;\n\n while (test) {\n x += test.offsetLeft - test.scrollLeft + test.clientLeft;\n y += test.offsetTop - test.scrollTop + test.clientTop;\n test = test.offsetParent as HTMLElement;\n }\n\n return { x, y };\n}\n\n/**\n * @deprecated use {@link getStyleProperty} (using dash-case instead of camelCase)\n */\nexport function getStyle(elt: Element, prop: string): string {\n return (window.getComputedStyle(elt, null) as any)[prop];\n}\n\n/**\n * Gets an element style value\n */\nexport function getStyleProperty(elt: Element, varname: string): string {\n return window.getComputedStyle(elt).getPropertyValue(varname);\n}\n\nexport type TouchData = {\n distance: number;\n angle: number;\n center: Point;\n};\n\n/**\n * Returns data about a touch event (first 2 fingers) : distance, angle, center\n */\nexport function getTouchData(e: TouchEvent): TouchData {\n if (e.touches.length < 2) {\n return null;\n }\n\n const p1 = { x: e.touches[0].clientX, y: e.touches[0].clientY };\n const p2 = { x: e.touches[1].clientX, y: e.touches[1].clientY };\n\n return {\n distance: distance(p1, p2),\n angle: angle(p1, p2),\n center: { x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2 },\n };\n}\n\n/**\n * Detects if fullscreen is enabled\n */\nexport function isFullscreenEnabled(elt: HTMLElement): boolean {\n return (document.fullscreenElement || (document as any).webkitFullscreenElement) === elt;\n}\n\n/**\n * Enters fullscreen mode\n */\nexport function requestFullscreen(elt: HTMLElement) {\n (elt.requestFullscreen || (elt as any).webkitRequestFullscreen).call(elt);\n}\n\n/**\n * Exits fullscreen mode\n */\nexport function exitFullscreen() {\n (document.exitFullscreen || (document as any).webkitExitFullscreen).call(document);\n}\n","/**\n * Transforms a string to dash-case\n * @link https://github.com/shahata/dasherize\n */\nexport function dasherize(str: string): string {\n return str.replace(/[A-Z](?:(?=[^A-Z])|[A-Z]*(?=[A-Z][^A-Z]|$))/g, (s, i) => {\n return (i > 0 ? '-' : '') + s.toLowerCase();\n });\n}\n\n/**\n * Returns a function, that, when invoked, will only be triggered at most once during a given window of time.\n */\nexport function throttle any>(callback: T, wait: number): (...args: Parameters) => void {\n let paused = false;\n return function (this: any, ...args: Parameters) {\n if (!paused) {\n paused = true;\n setTimeout(() => {\n callback.apply(this, args);\n paused = false;\n }, wait);\n }\n };\n}\n\n/**\n * Test if an object is a plain object\n * @description Test if an object is a plain object, i.e. is constructed\n * by the built-in Object constructor and inherits directly from Object.prototype\n * or null.\n * @link https://github.com/lodash/lodash/blob/master/isPlainObject.js\n */\nexport function isPlainObject>(value: any): value is T {\n if (typeof value !== 'object' || value === null || Object.prototype.toString.call(value) !== '[object Object]') {\n return false;\n }\n if (Object.getPrototypeOf(value) === null) {\n return true;\n }\n let proto = value;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n return Object.getPrototypeOf(value) === proto;\n}\n\n/**\n * Merges the enumerable attributes of two objects\n * @description Replaces arrays and alters the target object.\n * @copyright Nicholas Fisher \n */\nexport function deepmerge(target: T, src: T): T {\n const first = src;\n\n // eslint-disable-next-line @typescript-eslint/no-shadow\n return (function merge(target: any, src: any) {\n if (Array.isArray(src)) {\n if (!target || !Array.isArray(target)) {\n target = [];\n } else {\n target.length = 0;\n }\n src.forEach((e, i) => {\n target[i] = merge(null, e);\n });\n } else if (typeof src === 'object') {\n if (!target || Array.isArray(target)) {\n target = {};\n }\n Object.keys(src).forEach((key) => {\n if (typeof src[key] !== 'object' || !src[key] || !isPlainObject(src[key])) {\n target[key] = src[key];\n } else if (src[key] !== first) {\n if (!target[key]) {\n target[key] = merge(null, src[key]);\n } else {\n merge(target[key], src[key]);\n }\n }\n });\n } else {\n target = src;\n }\n\n return target;\n })(target, src);\n}\n\n/**\n * Deeply clones an object\n */\nexport function clone(src: T): T {\n return deepmerge(null as T, src);\n}\n\n/**\n * Tests of an object is empty\n */\nexport function isEmpty(obj: any): boolean {\n return !obj || (Object.keys(obj).length === 0 && obj.constructor === Object);\n}\n\n/**\n * Returns if a valu is null or undefined\n */\nexport function isNil(val: any): val is null | undefined {\n return val === null || val === undefined;\n}\n\n/**\n * Returns the first non null non undefined parameter\n */\nexport function firstNonNull(...values: T[]): T | null {\n for (const val of values) {\n if (!isNil(val)) {\n return val;\n }\n }\n\n return null;\n}\n\n/**\n * Returns deep equality between objects\n * @link https://gist.github.com/egardner/efd34f270cc33db67c0246e837689cb9\n */\nexport function deepEqual(obj1: any, obj2: any): boolean {\n if (obj1 === obj2) {\n return true;\n } else if (isObject(obj1) && isObject(obj2)) {\n if (Object.keys(obj1).length !== Object.keys(obj2).length) {\n return false;\n }\n for (const prop of Object.keys(obj1)) {\n if (!deepEqual(obj1[prop], obj2[prop])) {\n return false;\n }\n }\n return true;\n } else {\n return false;\n }\n}\n\nfunction isObject(obj: any): boolean {\n return typeof obj === 'object' && obj !== null;\n}\n","import { Euler, LinearFilter, LinearMipmapLinearFilter, MathUtils, Quaternion, Texture, Vector3 } from 'three';\nimport { PSVError } from '../PSVError';\nimport { ExtendedPosition, Point, ResolvableBoolean } from '../model';\nimport { getStyleProperty } from './browser';\nimport { wrap } from './math';\nimport { clone, isPlainObject } from './misc';\n\n/**\n * Executes a callback with the value of a ResolvableBoolean\n */\nexport function resolveBoolean(value: boolean | ResolvableBoolean, cb: (val: boolean, init: boolean) => void) {\n if (isPlainObject(value)) {\n cb((value as ResolvableBoolean).initial, true);\n (value as ResolvableBoolean).promise.then((res) => cb(res, false));\n } else {\n cb(value as boolean, true);\n }\n}\n\n/**\n * Inverts the result of a ResolvableBoolean\n */\nexport function invertResolvableBoolean(value: ResolvableBoolean): ResolvableBoolean {\n return {\n initial: !value.initial,\n promise: value.promise.then((res) => !res),\n };\n}\n\n/**\n * Builds an Error with name 'AbortError'\n */\nexport function getAbortError(): Error {\n const error = new Error('Loading was aborted.');\n error.name = 'AbortError';\n return error;\n}\n\n/**\n * Tests if an Error has name 'AbortError'\n */\nexport function isAbortError(err: Error): boolean {\n return err?.name === 'AbortError';\n}\n\n/**\n * Displays a warning in the console with \"PhotoSphereViewer\" prefix\n */\nexport function logWarn(message: string) {\n console.warn(`PhotoSphereViewer: ${message}`);\n}\n\n/**\n * Checks if an object is a ExtendedPosition, ie has textureX/textureY or yaw/pitch\n */\nexport function isExtendedPosition(object: any): object is ExtendedPosition {\n if (!object) {\n return false;\n }\n return [\n ['textureX', 'textureY'],\n ['yaw', 'pitch'],\n ].some(([key1, key2]) => {\n return object[key1] !== undefined && object[key2] !== undefined;\n });\n}\n\n/**\n * Returns the value of a given attribute in the panorama metadata\n */\nexport function getXMPValue(data: string, attr: string): number | null {\n // XMP data are stored in children\n let result = data.match('(.*)');\n if (result !== null) {\n const val = parseInt(result[1], 10);\n return isNaN(val) ? null : val;\n }\n\n // XMP data are stored in attributes\n result = data.match('GPano:' + attr + '=\"(.*?)\"');\n if (result !== null) {\n const val = parseInt(result[1], 10);\n return isNaN(val) ? null : val;\n }\n\n return null;\n}\n\nconst CSS_POSITIONS: Record = {\n top: '0%',\n bottom: '100%',\n left: '0%',\n right: '100%',\n center: '50%',\n};\nconst X_VALUES = ['left', 'center', 'right'];\nconst Y_VALUES = ['top', 'center', 'bottom'];\nconst POS_VALUES = [...X_VALUES, ...Y_VALUES];\nconst CENTER = 'center';\n\n/**\n * Translate CSS values like \"top center\" or \"10% 50%\" as top and left positions (0-1 range)\n * @description The implementation is as close as possible to the \"background-position\" specification\n * {@link https://developer.mozilla.org/en-US/docs/Web/CSS/background-position}\n */\nexport function parsePoint(value: string | Point): Point {\n if (!value) {\n return { x: 0.5, y: 0.5 };\n }\n\n if (typeof value === 'object') {\n return value;\n }\n\n let tokens = value.toLocaleLowerCase().split(' ').slice(0, 2);\n\n if (tokens.length === 1) {\n if (CSS_POSITIONS[tokens[0]]) {\n tokens = [tokens[0], CENTER];\n } else {\n tokens = [tokens[0], tokens[0]];\n }\n }\n\n const xFirst = tokens[1] !== 'left' && tokens[1] !== 'right' && tokens[0] !== 'top' && tokens[0] !== 'bottom';\n\n tokens = tokens.map((token) => CSS_POSITIONS[token] || token);\n\n if (!xFirst) {\n tokens.reverse();\n }\n\n const parsed = tokens.join(' ').match(/^([0-9.]+)% ([0-9.]+)%$/);\n\n if (parsed) {\n return {\n x: parseFloat(parsed[1]) / 100,\n y: parseFloat(parsed[2]) / 100,\n };\n } else {\n return { x: 0.5, y: 0.5 };\n }\n}\n\n/**\n * Parse a CSS-like position into an array of position keywords among top, bottom, left, right and center\n * @param value\n * @param [options]\n * @param [options.allowCenter=true] allow \"center center\"\n * @param [options.cssOrder=true] force CSS order (y axis then x axis)\n */\nexport function cleanCssPosition(\n value: string | string[],\n { allowCenter, cssOrder } = {\n allowCenter: true,\n cssOrder: true,\n }\n): [string, string] | null {\n if (!value) {\n return null;\n }\n\n if (typeof value === 'string') {\n value = value.split(' ');\n }\n\n if (value.length === 1) {\n if (value[0] === CENTER) {\n value = [CENTER, CENTER];\n } else if (X_VALUES.indexOf(value[0]) !== -1) {\n value = [CENTER, value[0]];\n } else if (Y_VALUES.indexOf(value[0]) !== -1) {\n value = [value[0], CENTER];\n }\n }\n\n if (value.length !== 2 || POS_VALUES.indexOf(value[0]) === -1 || POS_VALUES.indexOf(value[1]) === -1) {\n logWarn(`Unparsable position ${value}`);\n return null;\n }\n\n if (!allowCenter && value[0] === CENTER && value[1] === CENTER) {\n logWarn(`Invalid position center center`);\n return null;\n }\n\n if (cssOrder && !cssPositionIsOrdered(value)) {\n value = [value[1], value[0]];\n }\n if (value[1] === CENTER && X_VALUES.indexOf(value[0]) !== -1) {\n value = [CENTER, value[0]];\n }\n if (value[0] === CENTER && Y_VALUES.indexOf(value[1]) !== -1) {\n value = [value[1], CENTER];\n }\n\n return value as [string, string];\n}\n\n/**\n * Checks if an array of two positions is ordered (y axis then x axis)\n */\nexport function cssPositionIsOrdered(value: string[]): boolean {\n return Y_VALUES.indexOf(value[0]) !== -1 && X_VALUES.indexOf(value[1]) !== -1;\n}\n\n/**\n * @summary Parses an speed\n * @param speed in radians/degrees/revolutions per second/minute\n * @throws {@link PSVError} when the speed cannot be parsed\n */\nexport function parseSpeed(speed: string | number): number {\n let parsed;\n\n if (typeof speed === 'string') {\n const speedStr = speed.toString().trim();\n\n // Speed extraction\n let speedValue = parseFloat(speedStr.replace(/^(-?[0-9]+(?:\\.[0-9]*)?).*$/, '$1'));\n const speedUnit = speedStr.replace(/^-?[0-9]+(?:\\.[0-9]*)?(.*)$/, '$1').trim();\n\n // \"per minute\" -> \"per second\"\n if (speedUnit.match(/(pm|per minute)$/)) {\n speedValue /= 60;\n }\n\n // Which unit?\n switch (speedUnit) {\n // Degrees per minute / second\n case 'dpm':\n case 'degrees per minute':\n case 'dps':\n case 'degrees per second':\n parsed = MathUtils.degToRad(speedValue);\n break;\n\n // Radians per minute / second\n case 'rdpm':\n case 'radians per minute':\n case 'rdps':\n case 'radians per second':\n parsed = speedValue;\n break;\n\n // Revolutions per minute / second\n case 'rpm':\n case 'revolutions per minute':\n case 'rps':\n case 'revolutions per second':\n parsed = speedValue * Math.PI * 2;\n break;\n\n // Unknown unit\n default:\n throw new PSVError(`Unknown speed unit \"${speedUnit}\"`);\n }\n } else {\n parsed = speed;\n }\n\n return parsed;\n}\n\n/**\n * Converts a speed into a duration for a specific angle to travel\n */\nexport function speedToDuration(value: string | number, angle: number): number {\n if (typeof value !== 'number') {\n // desired radial speed\n const speed = parseSpeed(value);\n // compute duration\n return (angle / Math.abs(speed)) * 1000;\n } else {\n return Math.abs(value);\n }\n}\n\n/**\n * Parses an angle value in radians or degrees and returns a normalized value in radians\n * @param angle - eg: 3.14, 3.14rad, 180deg\n * @param [zeroCenter=false] - normalize between -Pi - Pi instead of 0 - 2*Pi\n * @param [halfCircle=zeroCenter] - normalize between -Pi/2 - Pi/2 instead of -Pi - Pi\n * @throws {@link PSVError} when the angle cannot be parsed\n */\nexport function parseAngle(angle: string | number, zeroCenter = false, halfCircle = zeroCenter): number {\n let parsed;\n\n if (typeof angle === 'string') {\n const match = angle\n .toLowerCase()\n .trim()\n .match(/^(-?[0-9]+(?:\\.[0-9]*)?)(.*)$/);\n\n if (!match) {\n throw new PSVError(`Unknown angle \"${angle}\"`);\n }\n\n const value = parseFloat(match[1]);\n const unit = match[2];\n\n if (unit) {\n switch (unit) {\n case 'deg':\n case 'degs':\n parsed = MathUtils.degToRad(value);\n break;\n case 'rad':\n case 'rads':\n parsed = value;\n break;\n default:\n throw new PSVError(`Unknown angle unit \"${unit}\"`);\n }\n } else {\n parsed = value;\n }\n } else if (typeof angle === 'number' && !isNaN(angle)) {\n parsed = angle;\n } else {\n throw new PSVError(`Unknown angle \"${angle}\"`);\n }\n\n parsed = wrap(zeroCenter ? parsed + Math.PI : parsed, Math.PI * 2);\n\n return zeroCenter\n ? MathUtils.clamp(parsed - Math.PI, -Math.PI / (halfCircle ? 2 : 1), Math.PI / (halfCircle ? 2 : 1))\n : parsed;\n}\n\n/**\n * Creates a THREE texture from an image\n */\nexport function createTexture(img: HTMLImageElement | HTMLCanvasElement, mimaps = false): Texture {\n const texture = new Texture(img);\n texture.needsUpdate = true;\n texture.minFilter = mimaps ? LinearMipmapLinearFilter : LinearFilter;\n texture.generateMipmaps = mimaps;\n texture.anisotropy = mimaps ? 2 : 1;\n return texture;\n}\n\nconst quaternion = new Quaternion();\n\n/**\n * Applies the inverse of Euler angles to a vector\n */\nexport function applyEulerInverse(vector: Vector3, euler: Euler) {\n quaternion.setFromEuler(euler).invert();\n vector.applyQuaternion(quaternion);\n}\n\n/**\n * Declaration of configuration parsers, used by {@link getConfigParser}\n */\nexport type ConfigParsers = {\n [key in keyof T]: (val: T[key], opts: { defValue: U[key]; rawConfig: T }) => U[key];\n};\n\n/**\n * Result of {@link getConfigParser}\n */\nexport type ConfigParser = {\n (config: T): U;\n defaults: Required;\n parsers: ConfigParsers;\n};\n\n/**\n * Creates a function to validate an user configuration object\n *\n * @template T type of input config\n * @template U type of config after parsing\n *\n * @param defaults the default configuration\n * @param parsers function used to parse/validate the configuration\n *\n * @example\n * ```ts\n * type MyConfig = {\n * value: number;\n * label?: string;\n * };\n *\n * const getConfig({\n * value: 1,\n * label: 'Title',\n * }, {\n * value(value, { defValue }) {\n * return value < 10 ? value : defValue;\n * }\n * });\n *\n * const config = getConfig({ value: 3 });\n * ```\n */\nexport function getConfigParser, U extends T = T>(\n defaults: Required,\n parsers?: ConfigParsers\n): ConfigParser {\n const parser = function (userConfig: T): U {\n if (!userConfig) {\n return clone(defaults);\n }\n\n const rawConfig: U = clone({\n ...defaults,\n ...userConfig,\n });\n\n const config: U = {} as U;\n\n for (let [key, value] of Object.entries(rawConfig) as Array<[keyof T, any]>) {\n if (parsers && key in parsers) {\n value = parsers[key](value, {\n rawConfig: rawConfig,\n defValue: defaults[key],\n });\n } else if (!(key in defaults)) {\n logWarn(`Unknown option ${key as string}`);\n continue;\n }\n\n // @ts-ignore\n config[key] = value;\n }\n\n return config;\n } as ConfigParser;\n\n parser.defaults = defaults;\n parser.parsers = parsers || ({} as any);\n\n return parser;\n}\n\n/**\n * Checks if a stylesheet is loaded by the presence of a CSS variable\n */\nexport function checkStylesheet(element: HTMLElement, name: string) {\n if (getStyleProperty(element, `--psv-${name}-loaded`) !== 'true') {\n console.error(`PhotoSphereViewer: stylesheet \"@photo-sphere-viewer/${name}/index.css\" is not loaded`);\n }\n}\n","export class PSVError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'PSVError';\n (Error as any).captureStackTrace?.(this, PSVError);\n }\n}\n","import { EASINGS } from '../data/constants';\n\n/**\n * Options for {@link Animation}\n */\nexport type AnimationOptions = {\n /**\n * interpolated properties\n */\n properties: Partial>;\n /**\n * duration of the animation\n */\n duration: number;\n /**\n * delay before start\n * @default 0\n */\n delay?: number;\n /**\n * interpoaltion function, see {@link CONSTANTS.EASINGS}\n * @default 'linear'\n */\n easing?: string | ((t: number) => number);\n /**\n * function called for each frame\n */\n onTick: (properties: Record, progress: number) => void;\n};\n\ntype PropertyValues = AnimationOptions['properties']['k'];\n\n/**\n * @summary Interpolation helper for animations\n * @description\n * Implements the Promise API with an additional \"cancel\" method.\n * The promise is resolved with `true` when the animation is completed and `false` if the animation is cancelled.\n * @template T the type of interpoalted properties\n *\n * @example\n * ```ts\n * const anim = new Animation({\n * properties: {\n * width: {start: 100, end: 200}\n * },\n * duration: 5000,\n * onTick: (properties) => element.style.width = `${properties.width}px`;\n * });\n *\n * anim.then((completed) => ...);\n *\n * anim.cancel();\n * ```\n */\nexport class Animation implements PromiseLike {\n private options: AnimationOptions;\n private easing: (t: number) => number = EASINGS['linear'];\n private callbacks: Array<(complete: boolean) => void> = [];\n private start?: number;\n private delayTimeout: ReturnType;\n private animationFrame: ReturnType;\n\n resolved = false;\n cancelled = false;\n\n constructor(options: AnimationOptions) {\n this.options = options;\n\n if (options) {\n if (options.easing) {\n this.easing =\n typeof options.easing === 'function'\n ? options.easing\n : EASINGS[options.easing] || EASINGS['linear'];\n }\n\n this.delayTimeout = setTimeout(() => {\n this.delayTimeout = undefined;\n this.animationFrame = window.requestAnimationFrame((t) => this.__run(t));\n }, options.delay || 0);\n } else {\n this.resolved = true;\n }\n }\n\n private __run(timestamp: number) {\n if (this.cancelled) {\n return;\n }\n\n // first iteration\n if (!this.start) {\n this.start = timestamp;\n }\n\n // compute progress\n const progress = (timestamp - this.start) / this.options.duration;\n const current = {} as Record;\n\n if (progress < 1.0) {\n // interpolate properties\n for (const [name, prop] of Object.entries(this.options.properties) as Array<[string, PropertyValues]>) {\n if (prop) {\n const value = prop.start + (prop.end - prop.start) * this.easing(progress);\n // @ts-ignore\n current[name] = value;\n }\n }\n this.options.onTick(current, progress);\n\n this.animationFrame = window.requestAnimationFrame((t) => this.__run(t));\n } else {\n // call onTick one last time with final values\n for (const [name, prop] of Object.entries(this.options.properties) as Array<[string, PropertyValues]>) {\n if (prop) {\n // @ts-ignore\n current[name] = prop.end;\n }\n }\n this.options.onTick(current, 1.0);\n\n this.__resolve(true);\n this.animationFrame = undefined;\n }\n }\n\n private __resolve(value: boolean) {\n if (value) {\n this.resolved = true;\n } else {\n this.cancelled = true;\n }\n this.callbacks.forEach((cb) => cb(value));\n this.callbacks.length = 0;\n }\n\n /**\n * Promise chaining\n * @param [onFulfilled] - Called when the animation is complete (true) or cancelled (false)\n */\n then(onFulfilled: (complete: boolean) => PromiseLike | U): Promise {\n if (this.resolved || this.cancelled) {\n return Promise.resolve(this.resolved).then(onFulfilled);\n }\n\n return new Promise((resolve: (complete: boolean) => void) => {\n this.callbacks.push(resolve);\n }).then(onFulfilled);\n }\n\n /**\n * Cancels the animation\n */\n cancel() {\n if (!this.cancelled && !this.resolved) {\n this.__resolve(false);\n\n if (this.delayTimeout) {\n window.clearTimeout(this.delayTimeout);\n this.delayTimeout = undefined;\n }\n if (this.animationFrame) {\n window.cancelAnimationFrame(this.animationFrame);\n this.animationFrame = undefined;\n }\n }\n }\n}\n","import { MathUtils } from 'three';\nimport { PSVError } from '../PSVError';\nimport { wrap } from './math';\n\nconst enum DynamicMode {\n STOP,\n INFINITE,\n POSITION,\n}\n\n/**\n * Represents a variable that can dynamically change with time (using requestAnimationFrame)\n */\nexport class Dynamic {\n private readonly min: number;\n private readonly max: number;\n private readonly wrap: boolean;\n\n private mode = DynamicMode.STOP;\n private speed = 0;\n private speedMult = 0;\n private currentSpeed = 0;\n private target = 0;\n private __current = 0;\n\n get current(): number {\n return this.__current;\n }\n\n private set current(current: number) {\n this.__current = current;\n }\n\n constructor(\n private readonly fn: (val: number) => void,\n config: {\n min: number;\n max: number;\n defaultValue: number;\n wrap: boolean;\n }\n ) {\n this.min = config.min;\n this.max = config.max;\n this.wrap = config.wrap;\n this.current = config.defaultValue;\n\n if (this.wrap && this.min !== 0) {\n throw new PSVError('invalid config');\n }\n\n if (this.fn) {\n this.fn(this.current);\n }\n }\n\n /**\n * Changes base speed\n */\n setSpeed(speed: number) {\n this.speed = speed;\n }\n\n /**\n * Defines the target position\n */\n goto(position: number, speedMult = 1) {\n this.mode = DynamicMode.POSITION;\n this.target = this.wrap ? wrap(position, this.max) : MathUtils.clamp(position, this.min, this.max);\n this.speedMult = speedMult;\n }\n\n /**\n * Increases/decreases the target position\n */\n step(step: number, speedMult = 1) {\n if (speedMult === 0) {\n this.setValue(this.current + step);\n } else {\n if (this.mode !== DynamicMode.POSITION) {\n this.target = this.current;\n }\n this.goto(this.target + step, speedMult);\n }\n }\n\n /**\n * Starts infinite movement\n */\n roll(invert = false, speedMult = 1) {\n this.mode = DynamicMode.INFINITE;\n this.target = invert ? -Infinity : Infinity;\n this.speedMult = speedMult;\n }\n\n /**\n * Stops movement\n */\n stop() {\n this.mode = DynamicMode.STOP;\n }\n\n /**\n * Defines the current position and immediately stops movement\n * @param {number} value\n */\n setValue(value: number): boolean {\n this.target = this.wrap ? wrap(value, this.max) : MathUtils.clamp(value, this.min, this.max);\n this.mode = DynamicMode.STOP;\n this.currentSpeed = 0;\n if (this.target !== this.current) {\n this.current = this.target;\n if (this.fn) {\n this.fn(this.current);\n }\n return true;\n }\n return false;\n }\n\n /**\n * @internal\n */\n update(elapsed: number): boolean {\n // in position mode switch to stop mode when in the decceleration window\n if (this.mode === DynamicMode.POSITION) {\n // in loop mode, alter \"current\" to avoid crossing the origin\n if (this.wrap && Math.abs(this.target - this.current) > this.max / 2) {\n this.current = this.current < this.target ? this.current + this.max : this.current - this.max;\n }\n\n const dstStop = (this.currentSpeed * this.currentSpeed) / (this.speed * this.speedMult * 4);\n if (Math.abs(this.target - this.current) <= dstStop) {\n this.mode = DynamicMode.STOP;\n }\n }\n\n // compute speed\n let targetSpeed = this.mode === DynamicMode.STOP ? 0 : this.speed * this.speedMult;\n if (this.target < this.current) {\n targetSpeed = -targetSpeed;\n }\n if (this.currentSpeed < targetSpeed) {\n this.currentSpeed = Math.min(\n targetSpeed,\n this.currentSpeed + (elapsed / 1000) * this.speed * this.speedMult * 2\n );\n } else if (this.currentSpeed > targetSpeed) {\n this.currentSpeed = Math.max(\n targetSpeed,\n this.currentSpeed - (elapsed / 1000) * this.speed * this.speedMult * 2\n );\n }\n\n // compute new position\n let next = null;\n if (this.current > this.target && this.currentSpeed) {\n next = Math.max(this.target, this.current + (this.currentSpeed * elapsed) / 1000);\n } else if (this.current < this.target && this.currentSpeed) {\n next = Math.min(this.target, this.current + (this.currentSpeed * elapsed) / 1000);\n }\n\n // apply value\n if (next !== null) {\n next = this.wrap ? wrap(next, this.max) : MathUtils.clamp(next, this.min, this.max);\n if (next !== this.current) {\n this.current = next;\n if (this.fn) {\n this.fn(this.current);\n }\n return true;\n }\n }\n\n return false;\n }\n}\n","import { Dynamic } from './Dynamic';\n\n/**\n * Wrapper for multiple {@link Dynamic} evolving together\n */\nexport class MultiDynamic> {\n get current(): Record {\n return Object.entries(this.dynamics).reduce(\n (values, [name, dynamic]) => {\n // @ts-ignore\n values[name] = dynamic.current;\n return values;\n },\n {} as Record\n );\n }\n\n constructor(\n private readonly fn: (val: Record) => void,\n private readonly dynamics: T\n ) {\n if (this.fn) {\n this.fn(this.current);\n }\n }\n\n /**\n * Changes base speed\n */\n setSpeed(speed: number) {\n for (const d of Object.values(this.dynamics)) {\n d.setSpeed(speed);\n }\n }\n\n /**\n * Defines the target positions\n */\n goto(positions: Partial>, speedMult = 1) {\n for (const [name, position] of Object.entries(positions)) {\n this.dynamics[name].goto(position as number, speedMult);\n }\n }\n\n /**\n * Increase/decrease the target positions\n */\n step(steps: Partial>, speedMult = 1) {\n if (speedMult === 0) {\n this.setValue(\n Object.keys(steps).reduce(\n (values, name: keyof T) => {\n values[name] = steps[name] + this.dynamics[name].current;\n return values;\n },\n {} as typeof steps\n )\n );\n } else {\n for (const [name, step] of Object.entries(steps)) {\n this.dynamics[name].step(step as number, speedMult);\n }\n }\n }\n\n /**\n * Starts infinite movements\n */\n roll(rolls: Partial>, speedMult = 1) {\n for (const [name, roll] of Object.entries(rolls)) {\n this.dynamics[name].roll(roll, speedMult);\n }\n }\n\n /**\n * Stops movements\n */\n stop() {\n for (const d of Object.values(this.dynamics)) {\n d.stop();\n }\n }\n\n /**\n * Defines the current positions and immediately stops movements\n */\n setValue(values: Partial>): boolean {\n let hasUpdates = false;\n\n for (const [name, value] of Object.entries(values)) {\n hasUpdates = this.dynamics[name].setValue(value as number) || hasUpdates;\n }\n\n if (hasUpdates && this.fn) {\n this.fn(this.current);\n }\n\n return hasUpdates;\n }\n\n /**\n * @internal\n */\n update(elapsed: number): boolean {\n let hasUpdates = false;\n\n for (const d of Object.values(this.dynamics)) {\n hasUpdates = d.update(elapsed) || hasUpdates;\n }\n\n if (hasUpdates && this.fn) {\n this.fn(this.current);\n }\n\n return hasUpdates;\n }\n}\n","/**\n * Helper for pressable things (buttons, keyboard)\n * @description When the pressed thing goes up and was not pressed long enough, wait a bit more before execution\n * @internal\n */\nexport class PressHandler {\n private time = 0;\n private timeout: ReturnType;\n\n get pending() {\n return this.time !== 0;\n }\n\n constructor(private readonly delay = 200) {\n this.delay = delay;\n }\n\n down() {\n if (this.timeout) {\n clearTimeout(this.timeout);\n this.timeout = undefined;\n }\n\n this.time = new Date().getTime();\n }\n\n up(cb: () => void) {\n if (!this.time) {\n return;\n }\n\n const elapsed = Date.now() - this.time;\n if (elapsed < this.delay) {\n this.timeout = setTimeout(() => {\n cb();\n this.timeout = undefined;\n this.time = 0;\n }, this.delay);\n } else {\n cb();\n this.time = 0;\n }\n }\n}\n","/**\n * Direction of a {@link Slider}\n */\nexport enum SliderDirection {\n VERTICAL = 'VERTICAL',\n HORIZONTAL = 'HORIZONTAL',\n}\n\n/**\n * Data transmitted to the {@link Slider} listener\n */\nexport type SliderUpdateData = {\n /**\n * slider progression for 0-1\n */\n readonly value: number;\n\n /**\n * the user clicked on the slider\n */\n readonly click: boolean;\n\n /**\n * the user moves the cursor above the slider, without click\n */\n readonly mouseover: boolean;\n\n /**\n * the user moves the cursor above the slider while maintaining click\n */\n readonly mousedown: boolean;\n\n /**\n * the cursor position on the page\n */\n readonly cursor: { clientX: number; clientY: number };\n};\n\n/**\n * Helper to make sliders elements\n */\nexport class Slider {\n private mousedown = false;\n private mouseover = false;\n\n get isVertical() {\n return this.direction === SliderDirection.VERTICAL;\n }\n\n get isHorizontal() {\n return this.direction === SliderDirection.HORIZONTAL;\n }\n\n constructor(\n /** main container of the sliding element */\n private readonly container: HTMLElement,\n /** direction of the slider */\n private readonly direction: SliderDirection,\n /** callback when the user interacts with the slider */\n private readonly listener: (data: SliderUpdateData) => void\n ) {\n this.container.addEventListener('click', this);\n this.container.addEventListener('mousedown', this);\n this.container.addEventListener('mouseenter', this);\n this.container.addEventListener('mouseleave', this);\n this.container.addEventListener('touchstart', this);\n this.container.addEventListener('mousemove', this, true);\n this.container.addEventListener('touchmove', this, true);\n window.addEventListener('mouseup', this);\n window.addEventListener('touchend', this);\n }\n\n destroy() {\n window.removeEventListener('mouseup', this);\n window.removeEventListener('touchend', this);\n }\n\n /**\n * @internal\n */\n handleEvent(e: Event) {\n // prettier-ignore\n switch (e.type) {\n case 'click': e.stopPropagation(); break;\n case 'mousedown': this.__onMouseDown(e as MouseEvent); break;\n case 'mouseenter': this.__onMouseEnter(e as MouseEvent); break;\n case 'mouseleave': this.__onMouseLeave(e as MouseEvent); break;\n case 'touchstart': this.__onTouchStart(e as TouchEvent); break;\n case 'mousemove': this.__onMouseMove(e as MouseEvent); break;\n case 'touchmove': this.__onTouchMove(e as TouchEvent); break;\n case 'mouseup': this.__onMouseUp(e as MouseEvent); break;\n case 'touchend': this.__onTouchEnd(e as TouchEvent); break;\n }\n }\n\n private __onMouseDown(evt: MouseEvent) {\n this.mousedown = true;\n this.__update(evt.clientX, evt.clientY, true);\n }\n\n private __onMouseEnter(evt: MouseEvent) {\n this.mouseover = true;\n this.__update(evt.clientX, evt.clientY, true);\n }\n\n private __onTouchStart(evt: TouchEvent) {\n this.mouseover = true;\n this.mousedown = true;\n const touch = evt.changedTouches[0];\n this.__update(touch.clientX, touch.clientY, true);\n }\n\n private __onMouseMove(evt: MouseEvent) {\n if (this.mousedown || this.mouseover) {\n evt.stopPropagation();\n this.__update(evt.clientX, evt.clientY, true);\n }\n }\n\n private __onTouchMove(evt: TouchEvent) {\n if (this.mousedown || this.mouseover) {\n evt.stopPropagation();\n const touch = evt.changedTouches[0];\n this.__update(touch.clientX, touch.clientY, true);\n }\n }\n\n private __onMouseUp(evt: MouseEvent) {\n if (this.mousedown) {\n this.mousedown = false;\n this.__update(evt.clientX, evt.clientY, false);\n }\n }\n\n private __onMouseLeave(evt: MouseEvent) {\n if (this.mouseover) {\n this.mouseover = false;\n this.__update(evt.clientX, evt.clientY, true);\n }\n }\n\n private __onTouchEnd(evt: TouchEvent) {\n if (this.mousedown) {\n this.mouseover = false;\n this.mousedown = false;\n const touch = evt.changedTouches[0];\n this.__update(touch.clientX, touch.clientY, false);\n }\n }\n\n private __update(clientX: number, clientY: number, moving: boolean) {\n const boundingClientRect = this.container.getBoundingClientRect();\n const cursor = this.isVertical ? clientY : clientX;\n const pos = boundingClientRect[this.isVertical ? 'bottom' : 'left'];\n const size = boundingClientRect[this.isVertical ? 'height' : 'width'];\n const val = Math.abs((pos - cursor) / size);\n\n this.listener({\n value: val,\n click: !moving,\n mousedown: this.mousedown,\n mouseover: this.mouseover,\n cursor: { clientX, clientY },\n });\n }\n}\n","import { Mesh } from 'three';\nimport { Tooltip, TooltipConfig } from './components/Tooltip';\nimport { TypedEvent } from './lib/TypedEventTarget';\nimport { ClickData, Point, Position, Size, TextureData, ViewerConfig } from './model';\nimport type { Viewer } from './Viewer';\n\n/**\n * Base class for all events dispatched by {@link Viewer}\n */\nexport abstract class ViewerEvent extends TypedEvent {}\n\n/**\n * @event Triggered before an animation, can be cancelled\n */\nexport class BeforeAnimateEvent extends ViewerEvent {\n static override readonly type = 'before-animate';\n override type: 'before-animate';\n\n /** @internal */\n constructor(\n /** target position, can be modified */\n public position?: Position,\n /** target zoom level, can be modified */\n public zoomLevel?: number\n ) {\n super(BeforeAnimateEvent.type, true);\n }\n}\n\n/**\n * @event Triggered before a render\n */\nexport class BeforeRenderEvent extends ViewerEvent {\n static override readonly type = 'before-render';\n override type: 'before-render';\n\n /** @internal */\n constructor(\n /** time provided by requestAnimationFrame */\n public readonly timestamp: number,\n /** time elapsed since the previous frame */\n public readonly elapsed: number\n ) {\n super(BeforeRenderEvent.type);\n }\n}\n\n/**\n * @event Triggered before a rotate operation, can be cancelled\n */\nexport class BeforeRotateEvent extends ViewerEvent {\n static override readonly type = 'before-rotate';\n override type: 'before-rotate';\n\n /** @internal */\n constructor(\n /** target position, can be modified */\n public position: Position\n ) {\n super(BeforeRotateEvent.type, true);\n }\n}\n\n/**\n * @event Triggered when the user clicks on the viewer (everywhere excluding the navbar and the side panel)\n */\nexport class ClickEvent extends ViewerEvent {\n static override readonly type = 'click';\n override type: 'click';\n\n /** @internal */\n constructor(public readonly data: ClickData) {\n super(ClickEvent.type);\n }\n}\n\n/**\n * @event Triggered when some options are changed\n */\nexport class ConfigChangedEvent extends ViewerEvent {\n static override readonly type = 'config-changed';\n override type: 'config-changed';\n\n /** @internal */\n constructor(public readonly options: Array) {\n super(ConfigChangedEvent.type);\n }\n\n /**\n * Checks if at least one of the `options` has been modified\n */\n containsOptions(...options: Array): boolean {\n return options.some((option) => this.options.includes(option));\n }\n}\n\n/**\n * @event Triggered when the user double clicks on the viewer. The simple `click` event is always fired before `dblclick`.\n */\nexport class DoubleClickEvent extends ViewerEvent {\n static override readonly type = 'dblclick';\n override type: 'dblclick';\n\n /** @internal */\n constructor(public readonly data: ClickData) {\n super(DoubleClickEvent.type);\n }\n}\n\n/**\n * @event Triggered when the fullscreen is enabled/disabled\n */\nexport class FullscreenEvent extends ViewerEvent {\n static override readonly type = 'fullscreen';\n override type: 'fullscreen';\n\n /** @internal */\n constructor(public readonly fullscreenEnabled: boolean) {\n super(FullscreenEvent.type);\n }\n}\n\n/**\n * @event Triggered when the notification is hidden\n */\nexport class HideNotificationEvent extends ViewerEvent {\n static override readonly type = 'hide-notification';\n override type: 'hide-notification';\n\n /** @internal */\n constructor(public readonly notificationId?: string) {\n super(HideNotificationEvent.type);\n }\n}\n\n/**\n * @event Triggered when the overlay is hidden\n */\nexport class HideOverlayEvent extends ViewerEvent {\n static override readonly type = 'hide-overlay';\n override type: 'hide-overlay';\n\n /** @internal */\n constructor(public readonly overlayId?: string) {\n super(HideOverlayEvent.type);\n }\n}\n\n/**\n * @event Triggered when the panel is hidden\n */\nexport class HidePanelEvent extends ViewerEvent {\n static override readonly type = 'hide-panel';\n override type: 'hide-panel';\n\n /** @internal */\n constructor(public readonly panelId?: string) {\n super(HidePanelEvent.type);\n }\n}\n\n/**\n * @event Triggered when a tooltip is hidden\n */\nexport class HideTooltipEvent extends ViewerEvent {\n static override readonly type = 'hide-tooltip';\n override type: 'hide-tooltip';\n\n /** @internal */\n constructor(\n /** Userdata associated to the tooltip */\n public readonly tooltipData: TooltipConfig['data']\n ) {\n super(HideTooltipEvent.type);\n }\n}\n\n/**\n * @event Triggered when a key is pressed, can be cancelled\n */\nexport class KeypressEvent extends ViewerEvent {\n static override readonly type = 'key-press';\n override type: 'key-press';\n\n /** @internal */\n constructor(public readonly key: string) {\n super(KeypressEvent.type, true);\n }\n}\n\n/**\n * @event Triggered when the loader value changes\n */\nexport class LoadProgressEvent extends ViewerEvent {\n static override readonly type = 'load-progress';\n override type: 'load-progress';\n\n /** @internal */\n constructor(public readonly progress: number) {\n super(LoadProgressEvent.type);\n }\n}\n\n/**\n * @event Triggered when a panorama image has been loaded\n */\nexport class PanoramaLoadedEvent extends ViewerEvent {\n static override readonly type = 'panorama-loaded';\n override type: 'panorama-loaded';\n\n /** @internal */\n constructor(public readonly data: TextureData) {\n super(PanoramaLoadedEvent.type);\n }\n}\n\n/**\n * @event Triggered when an error occured when loading the panorama\n */\nexport class PanoramaErrorEvent extends ViewerEvent {\n static override readonly type = 'panorama-error';\n override type: 'panorama-error';\n\n /** @internal */\n constructor(\n public readonly panorama: any,\n public readonly error: Error\n ) {\n super(PanoramaErrorEvent.type);\n }\n}\n\n/**\n * @event Triggered when the view angles change\n */\nexport class PositionUpdatedEvent extends ViewerEvent {\n static override readonly type = 'position-updated';\n override type: 'position-updated';\n\n /** @internal */\n constructor(public readonly position: Position) {\n super(PositionUpdatedEvent.type);\n }\n}\n\n/**\n * @event Triggered when the panorama image has been loaded and the viewer is ready to perform the first render\n */\nexport class ReadyEvent extends ViewerEvent {\n static override readonly type = 'ready';\n override type: 'ready';\n\n /** @internal */\n constructor() {\n super(ReadyEvent.type);\n }\n}\n\n/**\n * @event Triggered on each viewer render\n */\nexport class RenderEvent extends ViewerEvent {\n static override readonly type = 'render';\n override type: 'render';\n\n /** @internal */\n constructor() {\n super(RenderEvent.type);\n }\n}\n\n/**\n * @event Triggered when the notification is shown\n */\nexport class ShowNotificationEvent extends ViewerEvent {\n static override readonly type = 'show-notification';\n override type: 'show-notification';\n\n /** @internal */\n constructor(public readonly notificationId?: string) {\n super(ShowNotificationEvent.type);\n }\n}\n\n/**\n * @event Triggered when the overlay is shown\n */\nexport class ShowOverlayEvent extends ViewerEvent {\n static override readonly type = 'show-overlay';\n override type: 'show-overlay';\n\n /** @internal */\n constructor(public readonly overlayId?: string) {\n super(ShowOverlayEvent.type);\n }\n}\n\n/**\n * @event Triggered when the panel is shown\n */\nexport class ShowPanelEvent extends ViewerEvent {\n static override readonly type = 'show-panel';\n override type: 'show-panel';\n\n /** @internal */\n constructor(public readonly panelId?: string) {\n super(ShowPanelEvent.type);\n }\n}\n\n/**\n * @event Triggered when a tooltip is shown\n */\nexport class ShowTooltipEvent extends ViewerEvent {\n static override readonly type = 'show-tooltip';\n override type: 'show-tooltip';\n\n /** @internal */\n constructor(\n /** Instance of the tooltip */\n public readonly tooltip: Tooltip,\n /** Userdata associated to the tooltip */\n public readonly tooltipData?: TooltipConfig['data']\n ) {\n super(ShowTooltipEvent.type);\n }\n}\n\n/**\n * @event Triggered when the viewer size changes\n */\nexport class SizeUpdatedEvent extends ViewerEvent {\n static override readonly type = 'size-updated';\n override type: 'size-updated';\n\n /** @internal */\n constructor(public readonly size: Size) {\n super(SizeUpdatedEvent.type);\n }\n}\n\n/**\n * @event Triggered when all current animations are stopped\n */\nexport class StopAllEvent extends ViewerEvent {\n static override readonly type = 'stop-all';\n override type: 'stop-all';\n\n /** @internal */\n constructor() {\n super(StopAllEvent.type);\n }\n}\n\n/**\n * @event Triggered when the viewer zoom changes\n */\nexport class ZoomUpdatedEvent extends ViewerEvent {\n static override readonly type = 'zoom-updated';\n override type: 'zoom-updated';\n\n /** @internal */\n constructor(public readonly zoomLevel: number) {\n super(ZoomUpdatedEvent.type);\n }\n}\n\n/**\n * Base class for events on three.js objects\n *\n * Note: {@link Viewer#observeObjects} must be called for these events to be dispatched\n */\nexport abstract class ObjectEvent extends ViewerEvent {\n /** @internal */\n constructor(\n type: string,\n public readonly originalEvent: MouseEvent,\n public readonly object: Mesh,\n public readonly viewerPoint: Point,\n public readonly userDataKey: string\n ) {\n super(type);\n }\n}\n\n/**\n * @event Triggered when the cursor enters an object in the scene\n *\n * Note: {@link Viewer#observeObjects} must be called for this event to be dispatched\n */\nexport class ObjectEnterEvent extends ObjectEvent {\n static override readonly type = 'enter-object';\n override type: 'enter-object';\n\n /** @internal */\n constructor(originalEvent: MouseEvent, object: Mesh, viewerPoint: Point, userDataKey: string) {\n super(ObjectEnterEvent.type, originalEvent, object, viewerPoint, userDataKey);\n }\n}\n\n/**\n * @event Triggered when the cursor leaves an object in the scene\n *\n * Note: {@link Viewer#observeObjects} must be called for this event to be dispatched\n */\nexport class ObjectLeaveEvent extends ObjectEvent {\n static override readonly type = 'leave-object';\n override type: 'leave-object';\n\n /** @internal */\n constructor(originalEvent: MouseEvent, object: Mesh, viewerPoint: Point, userDataKey: string) {\n super(ObjectLeaveEvent.type, originalEvent, object, viewerPoint, userDataKey);\n }\n}\n\n/**\n * @event Triggered when the cursor moves over an object in the scene\n *\n * Note: {@link Viewer#observeObjects} must be called for this event to be dispatched\n */\nexport class ObjectHoverEvent extends ObjectEvent {\n static override readonly type = 'hover-object';\n override type: 'hover-object';\n\n /** @internal */\n constructor(originalEvent: MouseEvent, object: Mesh, viewerPoint: Point, userDataKey: string) {\n super(ObjectHoverEvent.type, originalEvent, object, viewerPoint, userDataKey);\n }\n}\n\nexport type ViewerEvents =\n | BeforeAnimateEvent\n | BeforeRenderEvent\n | BeforeRotateEvent\n | ClickEvent\n | ConfigChangedEvent\n | DoubleClickEvent\n | FullscreenEvent\n | HideNotificationEvent\n | HideOverlayEvent\n | HidePanelEvent\n | HideTooltipEvent\n | KeypressEvent\n | LoadProgressEvent\n | PanoramaLoadedEvent\n | PanoramaErrorEvent\n | PositionUpdatedEvent\n | ReadyEvent\n | RenderEvent\n | ShowNotificationEvent\n | ShowOverlayEvent\n | ShowPanelEvent\n | ShowTooltipEvent\n | SizeUpdatedEvent\n | StopAllEvent\n | ZoomUpdatedEvent\n | ObjectEnterEvent\n | ObjectLeaveEvent\n | ObjectHoverEvent;\n","/**\n * Base class for events dispatched by {@link TypedEventTarget}\n * @template TTarget type of the event target\n */\nexport abstract class TypedEvent> extends Event {\n static readonly type: string;\n\n override target: TTarget;\n\n constructor(type: string, cancelable = false) {\n super(type, { cancelable });\n }\n}\n\n/**\n * Decorator for EventTarget allowing to strongly type events and listeners\n * @link https://rjzaworski.com/2021/06/event-target-with-typescript\n * @template TEvents union of dispatched events\n */\nexport class TypedEventTarget> extends EventTarget {\n override dispatchEvent(e: TEvents): boolean {\n return super.dispatchEvent(e);\n }\n\n /**\n * @template T the name of event\n * @template E the class of the event\n */\n override addEventListener(\n type: T,\n callback: ((e: E) => void) | EventListenerObject | null,\n options?: AddEventListenerOptions | boolean\n ) {\n super.addEventListener(type, callback as any, options);\n }\n\n /**\n * @template T the name of event\n * @template E the class of the event\n */\n override removeEventListener(\n type: TEvents['type'],\n callback: ((e: E) => void) | EventListenerObject | null,\n options?: EventListenerOptions | boolean\n ) {\n super.removeEventListener(type, callback as any, options);\n }\n}\n","import { Mesh, ShaderMaterial, ShaderMaterialParameters } from 'three';\nimport { PanoData, PanoDataProvider, TextureData } from '../model';\nimport type { Viewer } from '../Viewer';\n\n/**\n * Base class for adapters\n * @template TPanorama type of the panorama object\n * @template TTexture type of the loaded texture\n */\nexport abstract class AbstractAdapter {\n /**\n * Unique identifier of the adapter\n */\n static readonly id: string;\n\n /**\n * Indicates if the adapter supports panorama download natively\n */\n static readonly supportsDownload: boolean = false;\n\n /**\n * Indicates if the adapter can display an additional transparent image above the panorama\n */\n static readonly supportsOverlay: boolean = false;\n\n constructor(protected readonly viewer: Viewer) {}\n\n /**\n * Initializes the adapter\n */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init(): void {}\n\n /**\n * Destroys the adapter\n */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n destroy(): void {}\n\n /**\n * Indicates if the adapter supports transitions between panoramas\n */\n // @ts-ignore unused paramater\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n supportsTransition(panorama: TPanorama): boolean {\n return false;\n }\n\n /**\n * Indicates if the adapter supports preload of a panorama\n */\n // @ts-ignore unused paramater\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n supportsPreload(panorama: TPanorama): boolean {\n return false;\n }\n\n /**\n * Loads the panorama texture\n */\n abstract loadTexture(\n panorama: TPanorama,\n newPanoData?: PanoData | PanoDataProvider,\n useXmpPanoData?: boolean\n ): Promise>;\n\n /**\n * Creates the mesh\n */\n abstract createMesh(scale?: number): Mesh;\n\n /**\n * Applies the texture to the mesh\n */\n abstract setTexture(mesh: Mesh, textureData: TextureData, transition?: boolean): void;\n\n /**\n * Changes the opacity of the mesh\n */\n abstract setTextureOpacity(mesh: Mesh, opacity: number): void;\n\n /**\n * Clear a loaded texture from memory\n */\n abstract disposeTexture(textureData: TextureData): void;\n\n /**\n * Applies the overlay to the mesh\n */\n abstract setOverlay(mesh: Mesh, textureData: TextureData, opacity: number): void;\n\n /**\n * @internal\n */\n static OVERLAY_UNIFORMS = {\n panorama: 'panorama',\n overlay: 'overlay',\n globalOpacity: 'globalOpacity',\n overlayOpacity: 'overlayOpacity',\n };\n\n /**\n * @internal\n */\n static createOverlayMaterial({\n additionalUniforms,\n overrideVertexShader,\n }: {\n additionalUniforms?: ShaderMaterialParameters['uniforms'];\n overrideVertexShader?: ShaderMaterialParameters['vertexShader'];\n } = {}): ShaderMaterial {\n return new ShaderMaterial({\n uniforms: {\n ...additionalUniforms,\n [AbstractAdapter.OVERLAY_UNIFORMS.panorama]: { value: null },\n [AbstractAdapter.OVERLAY_UNIFORMS.overlay]: { value: null },\n [AbstractAdapter.OVERLAY_UNIFORMS.globalOpacity]: { value: 1.0 },\n [AbstractAdapter.OVERLAY_UNIFORMS.overlayOpacity]: { value: 0.0 },\n },\n\n vertexShader:\n overrideVertexShader ||\n `\nvarying vec2 vUv;\n\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}`,\n\n fragmentShader: `\nuniform sampler2D ${AbstractAdapter.OVERLAY_UNIFORMS.panorama};\nuniform sampler2D ${AbstractAdapter.OVERLAY_UNIFORMS.overlay};\nuniform float ${AbstractAdapter.OVERLAY_UNIFORMS.globalOpacity};\nuniform float ${AbstractAdapter.OVERLAY_UNIFORMS.overlayOpacity};\n\nvarying vec2 vUv;\n\nvoid main() {\n vec4 tColor1 = texture2D( ${AbstractAdapter.OVERLAY_UNIFORMS.panorama}, vUv );\n vec4 tColor2 = texture2D( ${AbstractAdapter.OVERLAY_UNIFORMS.overlay}, vUv );\n gl_FragColor = vec4(\n mix( tColor1.rgb, tColor2.rgb, tColor2.a * ${AbstractAdapter.OVERLAY_UNIFORMS.overlayOpacity} ),\n ${AbstractAdapter.OVERLAY_UNIFORMS.globalOpacity}\n );\n}`,\n });\n }\n}\n\n// prettier-ignore\nexport type AdapterConstructor = (new (viewer: Viewer, config?: any) => AbstractAdapter);\n\n/**\n * Returns the adapter constructor from the imported object\n * @internal\n */\nexport function adapterInterop(adapter: any): AdapterConstructor & typeof AbstractAdapter {\n if (adapter) {\n for (const [, p] of [['_', adapter], ...Object.entries(adapter)]) {\n if (p.prototype instanceof AbstractAdapter) {\n return p;\n }\n }\n }\n return null;\n}\n","import { BufferGeometry, MathUtils, Mesh, ShaderMaterial, SphereGeometry, Texture } from 'three';\nimport { PSVError } from '../PSVError';\nimport type { Viewer } from '../Viewer';\nimport { SPHERE_RADIUS } from '../data/constants';\nimport { SYSTEM } from '../data/system';\nimport { PanoData, PanoDataProvider, TextureData } from '../model';\nimport { createTexture, firstNonNull, getConfigParser, getXMPValue, isNil, logWarn } from '../utils';\nimport { AbstractAdapter } from './AbstractAdapter';\nimport { interpolationWorkerSrc } from './interpolationWorker';\n\n/**\n * Configuration for {@link EquirectangularAdapter}\n */\nexport type EquirectangularAdapterConfig = {\n /**\n * Background color of the canvas, which will be visible when using cropped panoramas\n * @default '#000'\n */\n backgroundColor?: string;\n /**\n * Interpolate the missing parts of cropped panoramas (async)\n */\n interpolateBackground?: boolean;\n /**\n * number of faces of the sphere geometry, higher values may decrease performances\n * @default 64\n */\n resolution?: number;\n /**\n * read real image size from XMP data\n * @default true\n */\n useXmpData?: boolean;\n /**\n * used for equirectangular tiles adapter\n * @internal\n */\n blur?: boolean;\n};\n\ntype EquirectangularMesh = Mesh;\ntype EquirectangularTexture = TextureData;\n\nconst getConfig = getConfigParser(\n {\n backgroundColor: '#000',\n interpolateBackground: false,\n resolution: 64,\n useXmpData: true,\n blur: false,\n },\n {\n resolution: (resolution) => {\n if (!resolution || !MathUtils.isPowerOfTwo(resolution)) {\n throw new PSVError('EquirectangularAdapter resolution must be power of two');\n }\n return resolution;\n },\n }\n);\n\n/**\n * Adapter for equirectangular panoramas\n */\nexport class EquirectangularAdapter extends AbstractAdapter {\n static override readonly id: string = 'equirectangular';\n static override readonly supportsDownload: boolean = true;\n static override readonly supportsOverlay: boolean = true;\n\n private readonly config: EquirectangularAdapterConfig;\n\n private interpolationWorker: Worker;\n\n private readonly SPHERE_SEGMENTS: number;\n private readonly SPHERE_HORIZONTAL_SEGMENTS: number;\n\n constructor(viewer: Viewer, config?: EquirectangularAdapterConfig) {\n super(viewer);\n\n this.config = getConfig(config);\n if (!isNil(this.viewer.config.useXmpData)) {\n this.config.useXmpData = this.viewer.config.useXmpData;\n }\n if (!isNil(this.viewer.config.canvasBackground)) {\n this.config.backgroundColor = this.viewer.config.canvasBackground;\n }\n\n if (this.config.interpolateBackground) {\n if (!window.Worker) {\n logWarn('Web Worker API not available');\n this.config.interpolateBackground = false;\n } else {\n this.interpolationWorker = new Worker(interpolationWorkerSrc);\n }\n }\n\n this.SPHERE_SEGMENTS = this.config.resolution;\n this.SPHERE_HORIZONTAL_SEGMENTS = this.SPHERE_SEGMENTS / 2;\n }\n\n override supportsTransition() {\n return true;\n }\n\n override supportsPreload() {\n return true;\n }\n\n override destroy(): void {\n this.interpolationWorker?.terminate();\n\n super.destroy();\n }\n\n async loadTexture(\n panorama: string,\n newPanoData: PanoData | PanoDataProvider,\n useXmpPanoData = this.config.useXmpData\n ): Promise {\n if (typeof panorama !== 'string') {\n return Promise.reject(new PSVError('Invalid panorama url, are you using the right adapter?'));\n }\n\n const blob = await this.viewer.textureLoader.loadFile(panorama, (p) => this.viewer.loader.setProgress(p), panorama);\n const xmpPanoData = useXmpPanoData ? await this.loadXMP(blob) : null;\n const img = await this.viewer.textureLoader.blobToImage(blob);\n\n if (typeof newPanoData === 'function') {\n newPanoData = newPanoData(img, xmpPanoData);\n }\n if (!newPanoData && !xmpPanoData) {\n newPanoData = this.__defaultPanoData(img);\n }\n\n const panoData = {\n fullWidth: firstNonNull(newPanoData?.fullWidth, xmpPanoData?.fullWidth, img.width),\n fullHeight: firstNonNull(newPanoData?.fullHeight, xmpPanoData?.fullHeight, img.height),\n croppedWidth: firstNonNull(newPanoData?.croppedWidth, xmpPanoData?.croppedWidth, img.width),\n croppedHeight: firstNonNull(newPanoData?.croppedHeight, xmpPanoData?.croppedHeight, img.height),\n croppedX: firstNonNull(newPanoData?.croppedX, xmpPanoData?.croppedX, 0),\n croppedY: firstNonNull(newPanoData?.croppedY, xmpPanoData?.croppedY, 0),\n poseHeading: firstNonNull(newPanoData?.poseHeading, xmpPanoData?.poseHeading, 0),\n posePitch: firstNonNull(newPanoData?.posePitch, xmpPanoData?.posePitch, 0),\n poseRoll: firstNonNull(newPanoData?.poseRoll, xmpPanoData?.poseRoll, 0),\n };\n\n if (panoData.croppedWidth !== img.width || panoData.croppedHeight !== img.height) {\n logWarn(`Invalid panoData, croppedWidth/croppedHeight is not coherent with the loaded image.\n panoData: ${panoData.croppedWidth}x${panoData.croppedHeight}, image: ${img.width}x${img.height}`);\n }\n if (Math.abs(panoData.fullWidth - panoData.fullHeight * 2) > 1) {\n logWarn('Invalid panoData, fullWidth should be twice fullHeight');\n panoData.fullWidth = panoData.fullHeight * 2;\n }\n if (panoData.croppedX + panoData.croppedWidth > panoData.fullWidth) {\n logWarn('Invalid panoData, croppedX + croppedWidth > fullWidth');\n panoData.croppedX = panoData.fullWidth - panoData.croppedWidth;\n }\n if (panoData.croppedY + panoData.croppedHeight > panoData.fullHeight) {\n logWarn('Invalid panoData, croppedY + croppedHeight > fullHeight');\n panoData.croppedY = panoData.fullHeight - panoData.croppedHeight;\n }\n\n const texture = this.createEquirectangularTexture(img, panoData);\n\n return {\n panorama,\n texture,\n panoData,\n cacheKey: panorama,\n };\n }\n\n /**\n * Loads the XMP data of an image\n */\n private async loadXMP(blob: Blob): Promise {\n const binary = await this.loadBlobAsString(blob);\n\n const a = binary.indexOf('');\n const data = binary.substring(a, b);\n\n if (a !== -1 && b !== -1 && data.includes('GPano:')) {\n return {\n fullWidth: getXMPValue(data, 'FullPanoWidthPixels'),\n fullHeight: getXMPValue(data, 'FullPanoHeightPixels'),\n croppedWidth: getXMPValue(data, 'CroppedAreaImageWidthPixels'),\n croppedHeight: getXMPValue(data, 'CroppedAreaImageHeightPixels'),\n croppedX: getXMPValue(data, 'CroppedAreaLeftPixels'),\n croppedY: getXMPValue(data, 'CroppedAreaTopPixels'),\n poseHeading: getXMPValue(data, 'PoseHeadingDegrees'),\n posePitch: getXMPValue(data, 'PosePitchDegrees'),\n poseRoll: getXMPValue(data, 'PoseRollDegrees'),\n };\n }\n\n return null;\n }\n\n /**\n * Reads a Blob as a string\n */\n private loadBlobAsString(blob: Blob): Promise {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsText(blob);\n });\n }\n\n /**\n * Creates the final texture from image and panorama data\n */\n private createEquirectangularTexture(img: HTMLImageElement, panoData: PanoData): Texture {\n // resize image / fill cropped parts with black\n if (this.config.blur\n || panoData.fullWidth > SYSTEM.maxTextureWidth\n || panoData.croppedWidth !== panoData.fullWidth\n || panoData.croppedHeight !== panoData.fullHeight\n ) {\n const ratio = Math.min(1, SYSTEM.maxCanvasWidth / panoData.fullWidth);\n\n const resizedPanoData = {\n fullWidth: panoData.fullWidth * ratio,\n fullHeight: panoData.fullHeight * ratio,\n croppedWidth: panoData.croppedWidth * ratio,\n croppedHeight: panoData.croppedHeight * ratio,\n croppedX: panoData.croppedX * ratio,\n croppedY: panoData.croppedY * ratio,\n };\n\n const buffer = document.createElement('canvas');\n buffer.width = resizedPanoData.fullWidth;\n buffer.height = resizedPanoData.fullHeight;\n\n const ctx = buffer.getContext('2d');\n\n if (this.config.backgroundColor) {\n ctx.fillStyle = this.config.backgroundColor;\n ctx.fillRect(0, 0, buffer.width, buffer.height);\n }\n\n if (this.config.blur) {\n ctx.filter = `blur(${buffer.width / 2048}px)`;\n }\n\n ctx.drawImage(\n img,\n resizedPanoData.croppedX,\n resizedPanoData.croppedY,\n resizedPanoData.croppedWidth,\n resizedPanoData.croppedHeight\n );\n\n const t = createTexture(buffer);\n\n if (this.config.interpolateBackground && (\n panoData.croppedWidth !== panoData.fullWidth\n || panoData.croppedHeight !== panoData.fullHeight\n )) {\n this.interpolationWorker.postMessage({\n image: ctx.getImageData(\n resizedPanoData.croppedX,\n resizedPanoData.croppedY,\n resizedPanoData.croppedWidth,\n resizedPanoData.croppedHeight\n ),\n panoData: resizedPanoData,\n });\n\n this.interpolationWorker.onmessage = (e) => {\n ctx.putImageData(e.data, 0, 0);\n t.needsUpdate = true;\n this.viewer.needsUpdate();\n };\n }\n\n return t;\n }\n\n return createTexture(img);\n }\n\n createMesh(scale = 1): EquirectangularMesh {\n // The middle of the panorama is placed at yaw=0\n const geometry = new SphereGeometry(\n SPHERE_RADIUS * scale,\n this.SPHERE_SEGMENTS,\n this.SPHERE_HORIZONTAL_SEGMENTS,\n -Math.PI / 2\n ).scale(-1, 1, 1) as SphereGeometry;\n\n const material = AbstractAdapter.createOverlayMaterial();\n\n return new Mesh(geometry, material);\n }\n\n setTexture(mesh: EquirectangularMesh, textureData: EquirectangularTexture) {\n this.__setUniform(mesh, AbstractAdapter.OVERLAY_UNIFORMS.panorama, textureData.texture);\n }\n\n setOverlay(mesh: EquirectangularMesh, textureData: EquirectangularTexture, opacity: number) {\n this.__setUniform(mesh, AbstractAdapter.OVERLAY_UNIFORMS.overlayOpacity, opacity);\n if (!textureData) {\n this.__setUniform(mesh, AbstractAdapter.OVERLAY_UNIFORMS.overlay, null);\n } else {\n this.__setUniform(mesh, AbstractAdapter.OVERLAY_UNIFORMS.overlay, textureData.texture);\n }\n }\n\n setTextureOpacity(mesh: EquirectangularMesh, opacity: number) {\n this.__setUniform(mesh, AbstractAdapter.OVERLAY_UNIFORMS.globalOpacity, opacity);\n mesh.material.transparent = opacity < 1;\n }\n\n disposeTexture(textureData: EquirectangularTexture) {\n textureData.texture?.dispose();\n }\n\n private __setUniform(mesh: EquirectangularMesh, uniform: string, value: any) {\n mesh.material.uniforms[uniform].value = value;\n }\n\n private __defaultPanoData(img: HTMLImageElement): PanoData {\n const fullWidth = Math.max(img.width, img.height * 2);\n const fullHeight = Math.round(fullWidth / 2);\n const croppedX = Math.round((fullWidth - img.width) / 2);\n const croppedY = Math.round((fullHeight - img.height) / 2);\n\n return {\n fullWidth: fullWidth,\n fullHeight: fullHeight,\n croppedWidth: img.width,\n croppedHeight: img.height,\n croppedX: croppedX,\n croppedY: croppedY,\n };\n }\n}\n","import { ResolvableBoolean } from '../model';\nimport { PSVError } from '../PSVError';\nimport { VIEWER_DATA } from './constants';\n\nconst LOCALSTORAGE_TOUCH_SUPPORT = `${VIEWER_DATA}_touchSupport`;\n\n/**\n * General information about the system\n */\nexport const SYSTEM = {\n /**\n * Indicates if the system data has been loaded\n */\n loaded: false,\n\n /**\n * Device screen pixel ratio\n */\n pixelRatio: 1,\n\n /**\n * Device supports WebGL\n */\n isWebGLSupported: false,\n\n /**\n * Maximum WebGL texture width\n */\n maxTextureWidth: 0,\n\n /**\n * Device supports touch events\n */\n isTouchEnabled: null as ResolvableBoolean,\n\n /**\n * Name of the fullscreen event\n */\n fullscreenEvent: null as string,\n\n /**\n * @internal\n */\n __maxCanvasWidth: null as number | null,\n\n /**\n * Maximum canvas width\n */\n get maxCanvasWidth(): number {\n if (this.__maxCanvasWidth === null) {\n this.__maxCanvasWidth = getMaxCanvasWidth(this.maxTextureWidth);\n }\n return this.__maxCanvasWidth;\n },\n\n /**\n * Loads the system if not already loaded\n * @internal\n */\n load() {\n if (!this.loaded) {\n const ctx = getWebGLCtx();\n\n this.pixelRatio = window.devicePixelRatio || 1;\n this.isWebGLSupported = ctx !== null;\n this.maxTextureWidth = ctx ? ctx.getParameter(ctx.MAX_TEXTURE_SIZE) : 0;\n this.isTouchEnabled = isTouchEnabled();\n this.fullscreenEvent = getFullscreenEvent();\n this.loaded = true;\n }\n\n if (!SYSTEM.isWebGLSupported) {\n throw new PSVError('WebGL is not supported.');\n }\n if (SYSTEM.maxTextureWidth === 0) {\n throw new PSVError('Unable to detect system capabilities');\n }\n },\n};\n\n/**\n * Tries to return a canvas webgl context\n */\nfunction getWebGLCtx(): WebGLRenderingContext | null {\n const canvas = document.createElement('canvas');\n const names = ['webgl2', 'webgl', 'experimental-webgl', 'moz-webgl', 'webkit-3d'];\n let context = null;\n\n if (!canvas.getContext) {\n return null;\n }\n\n if (\n names.some((name) => {\n try {\n context = canvas.getContext(name);\n return context !== null;\n } catch (e) {\n return false;\n }\n })\n ) {\n return context;\n } else {\n return null;\n }\n}\n\n/**\n * Detects if the user is using a touch screen\n */\nfunction isTouchEnabled(): ResolvableBoolean {\n let initial = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n if (LOCALSTORAGE_TOUCH_SUPPORT in localStorage) {\n initial = localStorage[LOCALSTORAGE_TOUCH_SUPPORT] === 'true';\n }\n\n const promise = new Promise((resolve) => {\n const clear = () => {\n window.removeEventListener('mousedown', listenerMouse);\n window.removeEventListener('touchstart', listenerTouch);\n clearTimeout(listenerTimeoutId);\n };\n\n const listenerMouse = () => {\n clear();\n localStorage[LOCALSTORAGE_TOUCH_SUPPORT] = false;\n resolve(false);\n };\n\n const listenerTouch = () => {\n clear();\n localStorage[LOCALSTORAGE_TOUCH_SUPPORT] = true;\n resolve(true);\n };\n\n const listenerTimeout = () => {\n clear();\n localStorage[LOCALSTORAGE_TOUCH_SUPPORT] = initial;\n resolve(initial);\n };\n\n window.addEventListener('mousedown', listenerMouse, false);\n window.addEventListener('touchstart', listenerTouch, false);\n const listenerTimeoutId = setTimeout(listenerTimeout, 10000);\n });\n\n return { initial, promise };\n}\n\n/**\n * Gets max canvas width supported by the browser.\n * We only test powers of 2 and height = width / 2 because that's what we need to generate WebGL textures\n */\nfunction getMaxCanvasWidth(maxWidth: number): number {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n canvas.width = maxWidth;\n canvas.height = maxWidth / 2;\n\n while (canvas.width > 1024) {\n ctx.fillStyle = 'white';\n ctx.fillRect(0, 0, 1, 1);\n\n try {\n if (ctx.getImageData(0, 0, 1, 1).data[0] > 0) {\n return canvas.width;\n }\n } catch (e) {\n // continue\n }\n\n canvas.width /= 2;\n canvas.height /= 2;\n }\n\n throw new PSVError('Unable to detect system capabilities');\n}\n\n/**\n * Gets the event name for fullscreen\n */\nfunction getFullscreenEvent(): string {\n if ('exitFullscreen' in document) {\n return 'fullscreenchange';\n }\n if ('webkitExitFullscreen' in document) {\n return 'webkitfullscreenchange';\n }\n return null;\n}\n","import type { RGB } from 'three';\nimport type { PanoData } from '../model';\n\n/**\n * Web Worker function to interpolate missing parts of cropped panoramas\n * WARNING : this function must be autonomous\n */\nfunction interpolationWorker() {\n self.onmessage = (e: MessageEvent) => {\n const panoData: PanoData = e.data.panoData;\n\n const buffer = new OffscreenCanvas(panoData.fullWidth, panoData.fullHeight);\n const ctx = buffer.getContext('2d');\n\n const img = new OffscreenCanvas(panoData.croppedWidth, panoData.croppedHeight);\n const ctxImg = img.getContext('2d');\n ctxImg.putImageData(e.data.image, 0, 0);\n\n autoBackground(buffer, img, panoData);\n\n postMessage(ctx.getImageData(0, 0, buffer.width, buffer.height));\n };\n\n function autoBackground(buffer: OffscreenCanvas, img: OffscreenCanvas, panoData: PanoData) {\n const croppedY2 = panoData.fullHeight - panoData.croppedHeight - panoData.croppedY;\n const croppedX2 = panoData.fullWidth - panoData.croppedWidth - panoData.croppedX;\n const middleY = panoData.croppedY + panoData.croppedHeight / 2;\n\n const blurSize = buffer.width / 32;\n const padding = blurSize;\n const edge = 10;\n const filter = `blur(${blurSize}px)`;\n\n const ctx = buffer.getContext('2d');\n\n // first draw to get the colors\n ctx.drawImage(\n img,\n panoData.croppedX,\n panoData.croppedY,\n panoData.croppedWidth,\n panoData.croppedHeight\n );\n\n // top section\n if (panoData.croppedY > 0) {\n if (panoData.croppedX > 0 || croppedX2 > 0) {\n ctx.filter = 'none';\n\n const colorLeft = getAverageColor(ctx, panoData.croppedX, panoData.croppedY, edge, edge, 2);\n const colorRight = getAverageColor(ctx, buffer.width - croppedX2 - 11, panoData.croppedY, edge, edge, 2);\n const colorCenter = averageRgb(colorLeft, colorRight);\n\n // top-left corner\n if (panoData.croppedX > 0) {\n ctx.fillStyle = createHorizontalGradient(ctx, 0, panoData.croppedX, colorCenter, colorLeft);\n ctx.fillRect(-padding, -padding, panoData.croppedX + padding * 2, middleY + padding);\n }\n\n // top right corner\n if (croppedX2 > 0) {\n ctx.fillStyle = createHorizontalGradient(ctx, buffer.width - croppedX2, buffer.width, colorRight, colorCenter);\n ctx.fillRect(buffer.width - croppedX2 - padding, -padding, croppedX2 + padding * 2, middleY + padding);\n }\n }\n\n ctx.filter = filter;\n\n // top\n ctx.drawImage(\n img,\n 0, 0,\n img.width, edge,\n panoData.croppedX, -padding,\n panoData.croppedWidth, panoData.croppedY + padding * 2\n );\n\n // hide to top seam\n ctx.fillStyle = rgbCss(getAverageColor(ctx, 0, 0, buffer.width, edge, edge));\n ctx.fillRect(-padding, -padding, buffer.width + padding * 2, padding * 2);\n }\n\n // bottom section\n if (croppedY2 > 0) {\n if (panoData.croppedX > 0 || croppedX2 > 0) {\n ctx.filter = 'none';\n\n const colorLeft = getAverageColor(ctx, panoData.croppedX, buffer.height - croppedY2 - 1 - edge, edge, edge, 2);\n const colorRight = getAverageColor(ctx, buffer.width - croppedX2 - 1 - edge, buffer.height - croppedY2 - 1 - edge, edge, edge, 2);\n const colorCenter = averageRgb(colorLeft, colorRight);\n\n // bottom-left corner\n if (panoData.croppedX > 0) {\n ctx.fillStyle = createHorizontalGradient(ctx, 0, panoData.croppedX, colorCenter, colorLeft);\n ctx.fillRect(-padding, middleY, panoData.croppedX + padding * 2, buffer.height - middleY + padding);\n }\n\n // bottom-right corner\n if (croppedX2 > 0) {\n ctx.fillStyle = createHorizontalGradient(ctx, buffer.width - croppedX2, buffer.width, colorRight, colorCenter);\n ctx.fillRect(buffer.width - croppedX2 - padding, middleY, croppedX2 + padding * 2, buffer.height - middleY + padding);\n }\n }\n\n ctx.filter = filter;\n\n // bottom\n ctx.drawImage(\n img,\n 0, img.height - edge,\n img.width, edge,\n panoData.croppedX, buffer.height - croppedY2 - padding,\n panoData.croppedWidth, croppedY2 + padding * 2\n );\n\n // hide the bottom seam\n ctx.fillStyle = rgbCss(getAverageColor(ctx, 0, buffer.height - 1 - edge, buffer.width, edge, edge));\n ctx.fillRect(-padding, buffer.height - padding, buffer.width + padding * 2, padding * 2);\n }\n\n // left section\n if (panoData.croppedX > 0) {\n ctx.filter = filter;\n\n ctx.drawImage(\n img,\n img.width - edge, 0,\n edge, img.height,\n -padding, panoData.croppedY,\n padding * 2, panoData.croppedHeight\n );\n\n ctx.drawImage(\n img,\n 0, 0,\n edge, img.height,\n 0, panoData.croppedY,\n panoData.croppedX + padding, panoData.croppedHeight\n );\n }\n\n // right section\n if (croppedX2 > 0) {\n ctx.filter = filter;\n\n ctx.drawImage(\n img,\n 0, 0,\n edge, img.height,\n buffer.width - padding, panoData.croppedY,\n padding * 2, panoData.croppedHeight\n );\n\n ctx.drawImage(\n img,\n img.width - edge, 0,\n edge, img.height,\n buffer.width - croppedX2 - padding, panoData.croppedY,\n croppedX2 + padding, panoData.croppedHeight\n );\n }\n\n ctx.filter = 'none';\n\n // final draw\n ctx.drawImage(\n img,\n panoData.croppedX,\n panoData.croppedY,\n panoData.croppedWidth,\n panoData.croppedHeight\n );\n }\n\n /**\n * Returns the CSS string for RGB color\n */\n function rgbCss(color: RGB): string {\n return `rgb(${color.r}, ${color.g}, ${color.b})`;\n }\n\n /**\n * Returns the average of two RGB colors\n */\n function averageRgb(c1: RGB, c2: RGB): RGB {\n return {\n r: Math.round(c1.r / 2 + c2.r / 2),\n g: Math.round(c1.g / 2 + c2.g / 2),\n b: Math.round(c1.b / 2 + c2.b / 2),\n };\n }\n\n /**\n * Creates a simple horizontal gradient\n */\n function createHorizontalGradient(\n ctx: OffscreenCanvasRenderingContext2D,\n x1: number,\n x2: number,\n c1: RGB,\n c2: RGB\n ) {\n const grad = ctx.createLinearGradient(x1, 0, x2, 0);\n grad.addColorStop(0, rgbCss(c1));\n grad.addColorStop(1, rgbCss(c2));\n return grad;\n }\n\n /**\n * Gets the average RGB color of a portion from a canvas element\n */\n function getAverageColor(\n ctx: OffscreenCanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n every: number\n ): RGB {\n every = Math.round(every);\n\n let r = 0;\n let g = 0;\n let b = 0;\n let count = 0;\n\n const data = ctx.getImageData(x, y, w, h);\n\n for (let row = 0; row < h; row += every) {\n for (let col = 0; col < w; col += every) {\n const i = 4 * (row * w + col);\n r += data.data[i];\n g += data.data[i + 1];\n b += data.data[i + 2];\n count++;\n }\n }\n\n r = Math.round(r / count);\n g = Math.round(g / count);\n b = Math.round(b / count);\n\n return { r, g, b };\n }\n}\n\nexport const interpolationWorkerSrc = URL.createObjectURL(\n new Blob(['(', interpolationWorker.toString(), ')()'], \n { type: 'application/javascript' })\n);\n","import type { Viewer } from '../Viewer';\n\n/**\n * Base class for UI components\n */\nexport abstract class AbstractComponent {\n /**\n * Reference to main controller\n */\n protected readonly viewer: Viewer;\n\n /**\n * All child components\n * @internal\n */\n readonly children: AbstractComponent[] = [];\n\n /**\n * Container element\n */\n readonly container: HTMLDivElement = document.createElement('div');\n\n /**\n * Internal properties\n * @internal\n */\n protected readonly state = {\n visible: true,\n };\n\n constructor(\n protected readonly parent: Viewer | AbstractComponent,\n config: { className?: string }\n ) {\n this.viewer = parent instanceof AbstractComponent ? parent.viewer : parent;\n\n this.container.className = config.className || '';\n\n this.parent.children.push(this);\n this.parent.container.appendChild(this.container);\n }\n\n /**\n * Destroys the component\n */\n destroy() {\n this.parent.container.removeChild(this.container);\n\n const childIdx = this.parent.children.indexOf(this);\n if (childIdx !== -1) {\n this.parent.children.splice(childIdx, 1);\n }\n\n this.children.slice().forEach((child) => child.destroy());\n this.children.length = 0;\n }\n\n /**\n * Displays or hides the component\n */\n toggle(visible = !this.isVisible()) {\n if (!visible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n /**\n * Hides the component\n */\n // @ts-ignore unused parameter\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n hide(options?: any) {\n this.container.style.display = 'none';\n this.state.visible = false;\n }\n\n /**\n * Displays the component\n */\n // @ts-ignore unused parameter\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n show(options?: any) {\n this.container.style.display = '';\n this.state.visible = true;\n }\n\n /**\n * Checks if the component is visible\n */\n isVisible(): boolean {\n return this.state.visible;\n }\n}\n","import { AbstractComponent } from '../components/AbstractComponent';\nimport type { Navbar } from '../components/Navbar';\nimport { KEY_CODES } from '../data/constants';\nimport { ResolvableBoolean } from '../model';\nimport { addClasses, getConfigParser, resolveBoolean, toggleClass } from '../utils';\n\n/**\n * Configuration for {@link AbstractButton}\n */\nexport type ButtonConfig = {\n id?: string;\n className?: string;\n title?: string;\n /**\n * if the button has an mouse hover effect\n * @default false\n */\n hoverScale?: boolean;\n /**\n * if the button can be moved to menu when the navbar is too small\n * @default false\n */\n collapsable?: boolean;\n /**\n * if the button is accessible with the keyboard\n * @default true\n */\n tabbable?: boolean;\n /**\n * icon of the button\n */\n icon?: string;\n /**\n * override icon when the button is active\n */\n iconActive?: string;\n};\n\nconst getConfig = getConfigParser({\n id: null,\n className: null,\n title: null,\n hoverScale: false,\n collapsable: false,\n tabbable: true,\n icon: null,\n iconActive: null,\n});\n\n/**\n * Base class for navbar buttons\n */\nexport abstract class AbstractButton extends AbstractComponent {\n /**\n * Unique identifier of the button\n */\n static readonly id: string;\n\n /**\n * Identifier to declare a group of buttons\n */\n static readonly groupId?: string;\n\n /**\n * Internal properties\n */\n protected override readonly state = {\n visible: true,\n enabled: true,\n supported: true,\n collapsed: false,\n active: false,\n width: 0,\n };\n\n protected readonly config: ButtonConfig;\n\n get id(): string {\n return this.config.id;\n }\n\n get title(): string {\n return this.container.title;\n }\n\n get content(): string {\n return this.container.innerHTML;\n }\n\n get width(): number {\n return this.state.width;\n }\n\n get collapsable(): boolean {\n return this.config.collapsable;\n }\n\n constructor(navbar: Navbar, config: ButtonConfig) {\n super(navbar, {\n className: `psv-button ${config.hoverScale ? 'psv-button--hover-scale' : ''} ${config.className || ''}`,\n });\n\n this.config = getConfig(config);\n this.config.id = (this.constructor as typeof AbstractButton).id;\n\n if (config.icon) {\n this.__setIcon(config.icon);\n }\n\n this.state.width = this.container.offsetWidth;\n\n if (this.config.title) {\n this.container.title = this.config.title;\n } else if (this.id && this.id in this.viewer.config.lang) {\n this.container.title = (this.viewer.config.lang as any)[this.id];\n }\n\n if (config.tabbable) {\n this.container.tabIndex = 0;\n }\n\n this.container.addEventListener('click', (e) => {\n if (this.state.enabled) {\n this.onClick();\n }\n e.stopPropagation();\n });\n\n this.container.addEventListener('keydown', (e) => {\n if (e.key === KEY_CODES.Enter && this.state.enabled) {\n this.onClick();\n e.stopPropagation();\n }\n });\n }\n\n /**\n * Action when the button is clicked\n */\n abstract onClick(): void;\n\n override show(refresh = true) {\n if (!this.isVisible()) {\n this.state.visible = true;\n if (!this.state.collapsed) {\n this.container.style.display = '';\n }\n if (refresh) {\n this.viewer.navbar.autoSize();\n }\n }\n }\n\n override hide(refresh = true) {\n if (this.isVisible()) {\n this.state.visible = false;\n this.container.style.display = 'none';\n if (refresh) {\n this.viewer.navbar.autoSize();\n }\n }\n }\n\n /**\n * Hides/shows the button depending of the result of {@link isSupported}\n * @internal\n */\n checkSupported() {\n resolveBoolean(this.isSupported(), (supported, init) => {\n if (!this.state) {\n return; // the component has been destroyed\n }\n this.state.supported = supported;\n if (!init) {\n this.toggle(supported);\n } else if (!supported) {\n this.hide();\n }\n });\n }\n\n /**\n * Perform action when the navbar size/content changes\n * @internal\n */\n autoSize() {\n // nothing\n }\n\n /**\n * Checks if the button can be displayed\n */\n isSupported(): boolean | ResolvableBoolean {\n return true;\n }\n\n /**\n * Changes the active state of the button\n */\n toggleActive(active = !this.state.active) {\n if (active !== this.state.active) {\n this.state.active = active;\n toggleClass(this.container, 'psv-button--active', this.state.active);\n\n if (this.config.iconActive) {\n this.__setIcon(this.state.active ? this.config.iconActive : this.config.icon);\n }\n }\n }\n\n /**\n * Disables the button\n */\n disable() {\n this.container.classList.add('psv-button--disabled');\n this.state.enabled = false;\n }\n\n /**\n * Enables the button\n */\n enable() {\n this.container.classList.remove('psv-button--disabled');\n this.state.enabled = true;\n }\n\n /**\n * Collapses the button in the navbar menu\n */\n collapse() {\n this.state.collapsed = true;\n this.container.style.display = 'none';\n }\n\n /**\n * Uncollapses the button from the navbar menu\n */\n uncollapse() {\n this.state.collapsed = false;\n if (this.state.visible) {\n this.container.style.display = '';\n }\n }\n\n private __setIcon(icon: string) {\n this.container.innerHTML = icon;\n addClasses(this.container.querySelector('svg'), 'psv-button-svg');\n }\n}\n\nexport type ButtonConstructor = (new (navbar: Navbar) => AbstractButton) & typeof AbstractButton;\n","import type { Navbar } from '../components/Navbar';\nimport { NavbarCustomButton } from '../model';\nimport { AbstractButton } from './AbstractButton';\n\nexport class CustomButton extends AbstractButton {\n private readonly customOnClick: NavbarCustomButton['onClick'];\n\n constructor(navbar: Navbar, config: NavbarCustomButton) {\n super(navbar, {\n className: `psv-custom-button ${config.className || ''}`,\n hoverScale: false,\n collapsable: config.collapsable !== false,\n tabbable: config.tabbable !== false,\n title: config.title,\n });\n\n this.customOnClick = config.onClick;\n\n if (config.id) {\n this.config.id = config.id;\n } else {\n this.config.id = 'psvButton-' + Math.random().toString(36).substring(2);\n }\n\n if (config.content) {\n this.container.innerHTML = config.content;\n }\n\n this.state.width = this.container.offsetWidth;\n\n if (config.disabled) {\n this.disable();\n }\n\n if (config.visible === false) {\n this.hide();\n }\n }\n\n onClick() {\n this.customOnClick?.(this.viewer);\n }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { ICONS, IDS } from '../data/constants';\nimport {\n ConfigChangedEvent,\n HideNotificationEvent,\n HidePanelEvent,\n ShowNotificationEvent,\n ShowPanelEvent,\n} from '../events';\nimport { AbstractButton } from './AbstractButton';\n\nconst enum DescriptionButtonMode {\n NONE,\n NOTIF,\n PANEL,\n}\n\nexport class DescriptionButton extends AbstractButton {\n static override readonly id = 'description';\n\n private mode = DescriptionButtonMode.NONE;\n\n constructor(navbar: Navbar) {\n super(navbar, {\n className: 'psv-description-button',\n hoverScale: true,\n collapsable: false,\n tabbable: true,\n icon: ICONS.info,\n });\n\n this.viewer.addEventListener(HideNotificationEvent.type, this);\n this.viewer.addEventListener(ShowNotificationEvent.type, this);\n this.viewer.addEventListener(HidePanelEvent.type, this);\n this.viewer.addEventListener(ShowPanelEvent.type, this);\n this.viewer.addEventListener(ConfigChangedEvent.type, this);\n }\n\n override destroy() {\n this.viewer.removeEventListener(HideNotificationEvent.type, this);\n this.viewer.removeEventListener(ShowNotificationEvent.type, this);\n this.viewer.removeEventListener(HidePanelEvent.type, this);\n this.viewer.removeEventListener(ShowPanelEvent.type, this);\n this.viewer.removeEventListener(ConfigChangedEvent.type, this);\n\n super.destroy();\n }\n\n handleEvent(e: Event) {\n if (e instanceof ConfigChangedEvent) {\n e.containsOptions('description') && this.autoSize(true);\n return;\n }\n\n if (!this.mode) {\n return;\n }\n\n let closed = false;\n if (e instanceof HideNotificationEvent) {\n closed = this.mode === DescriptionButtonMode.NOTIF;\n } else if (e instanceof ShowNotificationEvent) {\n closed = this.mode === DescriptionButtonMode.NOTIF && e.notificationId !== IDS.DESCRIPTION;\n } else if (e instanceof HidePanelEvent) {\n closed = this.mode === DescriptionButtonMode.PANEL;\n } else if (e instanceof ShowPanelEvent) {\n closed = this.mode === DescriptionButtonMode.PANEL && e.panelId !== IDS.DESCRIPTION;\n }\n\n if (closed) {\n this.toggleActive(false);\n this.mode = DescriptionButtonMode.NONE;\n }\n }\n\n onClick() {\n if (this.mode) {\n this.__close();\n } else {\n this.__open();\n }\n }\n\n override hide(refresh?: boolean) {\n super.hide(refresh);\n\n if (this.mode) {\n this.__close();\n }\n }\n\n /**\n * This button can only be refreshed from NavbarCaption\n * @internal\n */\n override autoSize(refresh = false) {\n if (refresh) {\n const caption = this.viewer.navbar.getButton('caption', false);\n const captionHidden = caption && !caption.isVisible();\n const hasDescription = !!this.viewer.config.description;\n\n if (captionHidden || hasDescription) {\n this.show(false);\n } else {\n this.hide(false);\n }\n }\n }\n\n private __close() {\n switch (this.mode) {\n case DescriptionButtonMode.NOTIF:\n this.viewer.notification.hide(IDS.DESCRIPTION);\n break;\n case DescriptionButtonMode.PANEL:\n this.viewer.panel.hide(IDS.DESCRIPTION);\n break;\n default:\n }\n }\n\n private __open() {\n this.toggleActive(true);\n\n if (this.viewer.config.description) {\n this.mode = DescriptionButtonMode.PANEL;\n this.viewer.panel.show({\n id: IDS.DESCRIPTION,\n content:\n (this.viewer.config.caption ? `

${this.viewer.config.caption}

` : '') +\n this.viewer.config.description,\n });\n } else {\n this.mode = DescriptionButtonMode.NOTIF;\n this.viewer.notification.show({\n id: IDS.DESCRIPTION,\n content: this.viewer.config.caption,\n });\n }\n }\n}\n","import { AbstractAdapter } from '../adapters/AbstractAdapter';\nimport type { Navbar } from '../components/Navbar';\nimport { ICONS } from '../data/constants';\nimport { ConfigChangedEvent } from '../events';\nimport { AbstractButton } from './AbstractButton';\n\nexport class DownloadButton extends AbstractButton {\n static override readonly id = 'download';\n\n constructor(navbar: Navbar) {\n super(navbar, {\n className: 'psv-download-button',\n hoverScale: true,\n collapsable: true,\n tabbable: true,\n icon: ICONS.download,\n });\n\n this.viewer.addEventListener(ConfigChangedEvent.type, this);\n }\n\n override destroy(): void {\n this.viewer.removeEventListener(ConfigChangedEvent.type, this);\n\n super.destroy();\n }\n\n handleEvent(e: Event) {\n if (e instanceof ConfigChangedEvent) {\n e.containsOptions('downloadUrl') && this.checkSupported();\n }\n }\n\n onClick() {\n const link = document.createElement('a');\n link.href = this.viewer.config.downloadUrl || this.viewer.config.panorama;\n if (link.href.startsWith('data:') && !this.viewer.config.downloadName) {\n link.download = 'panorama.' + link.href.substring(0, link.href.indexOf(';')).split('/').pop();\n } else {\n link.download = this.viewer.config.downloadName || link.href.split('/').pop();\n }\n link.target = '_blank';\n this.viewer.container.appendChild(link);\n link.click();\n\n setTimeout(() => {\n this.viewer.container.removeChild(link);\n }, 100);\n }\n\n override checkSupported() {\n const supported =\n (this.viewer.adapter.constructor as typeof AbstractAdapter).supportsDownload ||\n this.viewer.config.downloadUrl;\n if (supported) {\n this.show();\n } else {\n this.hide();\n }\n }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { FullscreenEvent } from '../events';\nimport { AbstractButton } from './AbstractButton';\nimport { ICONS } from '../data/constants';\n\nexport class FullscreenButton extends AbstractButton {\n static override readonly id = 'fullscreen';\n\n constructor(navbar: Navbar) {\n super(navbar, {\n className: 'psv-fullscreen-button',\n hoverScale: true,\n collapsable: false,\n tabbable: true,\n icon: ICONS.fullscreenIn,\n iconActive: ICONS.fullscreenOut,\n });\n\n this.viewer.addEventListener(FullscreenEvent.type, this);\n }\n\n override destroy() {\n this.viewer.removeEventListener(FullscreenEvent.type, this);\n\n super.destroy();\n }\n\n handleEvent(e: Event) {\n if (e instanceof FullscreenEvent) {\n this.toggleActive(e.fullscreenEnabled);\n }\n }\n\n onClick() {\n this.viewer.toggleFullscreen();\n }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { ICONS, IDS } from '../data/constants';\nimport { HidePanelEvent, ShowPanelEvent } from '../events';\nimport { getClosest } from '../utils';\nimport { AbstractButton } from './AbstractButton';\n\nconst BUTTON_DATA = 'psvButton';\n\nconst MENU_TEMPLATE = (buttons: AbstractButton[], title: string) => `\n
\n

${ICONS.menu} ${title}

\n
    \n ${buttons\n .map(\n (button) => `\n
  • \n ${button.content}\n ${button.title}\n
  • \n `\n )\n .join('')}\n
\n
\n`;\n\nexport class MenuButton extends AbstractButton {\n static override readonly id = 'menu';\n\n constructor(navbar: Navbar) {\n super(navbar, {\n className: 'psv-menu-button',\n hoverScale: true,\n collapsable: false,\n tabbable: true,\n icon: ICONS.menu,\n });\n\n this.viewer.addEventListener(ShowPanelEvent.type, this);\n this.viewer.addEventListener(HidePanelEvent.type, this);\n\n super.hide();\n }\n\n override destroy() {\n this.viewer.removeEventListener(ShowPanelEvent.type, this);\n this.viewer.removeEventListener(HidePanelEvent.type, this);\n\n super.destroy();\n }\n\n handleEvent(e: Event) {\n if (e instanceof ShowPanelEvent) {\n this.toggleActive(e.panelId === IDS.MENU);\n } else if (e instanceof HidePanelEvent) {\n this.toggleActive(false);\n }\n }\n\n onClick() {\n if (this.state.active) {\n this.__hideMenu();\n } else {\n this.__showMenu();\n }\n }\n\n override hide(refresh?: boolean) {\n super.hide(refresh);\n this.__hideMenu();\n }\n\n override show(refresh?: boolean) {\n super.show(refresh);\n\n if (this.state.active) {\n this.__showMenu();\n }\n }\n\n private __showMenu() {\n this.viewer.panel.show({\n id: IDS.MENU,\n content: MENU_TEMPLATE(this.viewer.navbar.collapsed, this.viewer.config.lang.menu),\n noMargin: true,\n clickHandler: (target) => {\n const li = target ? getClosest(target as HTMLElement, 'li') : undefined;\n const buttonId = li ? li.dataset[BUTTON_DATA] : undefined;\n\n if (buttonId) {\n this.viewer.navbar.getButton(buttonId).onClick();\n this.__hideMenu();\n }\n },\n });\n }\n\n private __hideMenu() {\n this.viewer.panel.hide(IDS.MENU);\n }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { ICONS, KEY_CODES } from '../data/constants';\nimport { SYSTEM } from '../data/system';\nimport { invertResolvableBoolean } from '../utils';\nimport { PressHandler } from '../utils/PressHandler';\nimport { AbstractButton } from './AbstractButton';\n\nexport const enum MoveButtonDirection {\n UP,\n DOWN,\n LEFT,\n RIGHT,\n}\n\nfunction getIcon(value: MoveButtonDirection): string {\n let angle = 0;\n // prettier-ignore\n switch (value) {\n case MoveButtonDirection.UP: angle = 90; break;\n case MoveButtonDirection.DOWN: angle = -90; break;\n case MoveButtonDirection.RIGHT: angle = 180; break;\n default: angle = 0; break;\n }\n\n return ICONS.arrow.replace('rotate(0', `rotate(${angle}`);\n}\n\nexport abstract class AbstractMoveButton extends AbstractButton {\n static override readonly groupId = 'move';\n\n private readonly handler = new PressHandler();\n\n constructor(\n navbar: Navbar,\n private direction: MoveButtonDirection\n ) {\n super(navbar, {\n className: 'psv-move-button',\n hoverScale: true,\n collapsable: false,\n tabbable: true,\n icon: getIcon(direction),\n });\n\n this.container.addEventListener('mousedown', this);\n this.container.addEventListener('keydown', this);\n this.container.addEventListener('keyup', this);\n this.viewer.container.addEventListener('mouseup', this);\n this.viewer.container.addEventListener('touchend', this);\n }\n\n override destroy() {\n this.__onMouseUp();\n\n this.viewer.container.removeEventListener('mouseup', this);\n this.viewer.container.removeEventListener('touchend', this);\n\n super.destroy();\n }\n\n handleEvent(e: Event) {\n // prettier-ignore\n switch (e.type) {\n case 'mousedown': this.__onMouseDown(); break;\n case 'mouseup': this.__onMouseUp(); break;\n case 'touchend': this.__onMouseUp(); break;\n case 'keydown': (e as KeyboardEvent).key === KEY_CODES.Enter && this.__onMouseDown(); break;\n case 'keyup': (e as KeyboardEvent).key === KEY_CODES.Enter && this.__onMouseUp(); break;\n }\n }\n\n onClick() {\n // nothing\n }\n\n override isSupported() {\n return invertResolvableBoolean(SYSTEM.isTouchEnabled);\n }\n\n private __onMouseDown() {\n if (!this.state.enabled) {\n return;\n }\n\n const dynamicRoll: {\n yaw?: boolean;\n pitch?: boolean;\n } = {};\n // prettier-ignore\n switch (this.direction) {\n case MoveButtonDirection.UP: dynamicRoll.pitch = false; break;\n case MoveButtonDirection.DOWN: dynamicRoll.pitch = true; break;\n case MoveButtonDirection.RIGHT: dynamicRoll.yaw = false; break;\n default: dynamicRoll.yaw = true; break;\n }\n\n this.viewer.stopAll();\n this.viewer.dynamics.position.roll(dynamicRoll);\n this.handler.down();\n }\n\n private __onMouseUp() {\n if (!this.state.enabled) {\n return;\n }\n\n this.handler.up(() => {\n this.viewer.dynamics.position.stop();\n this.viewer.resetIdleTimer();\n });\n }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { AbstractMoveButton, MoveButtonDirection } from './AbstractMoveButton';\n\nexport class MoveDownButton extends AbstractMoveButton {\n static override readonly id = 'moveDown';\n\n constructor(navbar: Navbar) {\n super(navbar, MoveButtonDirection.DOWN);\n }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { AbstractMoveButton, MoveButtonDirection } from './AbstractMoveButton';\n\nexport class MoveLeftButton extends AbstractMoveButton {\n static override readonly id = 'moveLeft';\n\n constructor(navbar: Navbar) {\n super(navbar, MoveButtonDirection.LEFT);\n }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { AbstractMoveButton, MoveButtonDirection } from './AbstractMoveButton';\n\nexport class MoveRightButton extends AbstractMoveButton {\n static override readonly id = 'moveRight';\n\n constructor(navbar: Navbar) {\n super(navbar, MoveButtonDirection.RIGHT);\n }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { AbstractMoveButton, MoveButtonDirection } from './AbstractMoveButton';\n\nexport class MoveUpButton extends AbstractMoveButton {\n static override readonly id = 'moveUp';\n\n constructor(navbar: Navbar) {\n super(navbar, MoveButtonDirection.UP);\n }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { KEY_CODES } from '../data/constants';\nimport { SYSTEM } from '../data/system';\nimport { invertResolvableBoolean } from '../utils';\nimport { PressHandler } from '../utils/PressHandler';\nimport { AbstractButton } from './AbstractButton';\n\nexport const enum ZoomButtonDirection {\n IN,\n OUT,\n}\n\nexport class AbstractZoomButton extends AbstractButton {\n static override readonly groupId = 'zoom';\n\n private readonly handler = new PressHandler();\n\n constructor(\n navbar: Navbar,\n icon: string,\n private direction: ZoomButtonDirection\n ) {\n super(navbar, {\n className: 'psv-zoom-button',\n hoverScale: true,\n collapsable: false,\n tabbable: true,\n icon: icon,\n });\n\n this.container.addEventListener('mousedown', this);\n this.container.addEventListener('keydown', this);\n this.container.addEventListener('keyup', this);\n this.viewer.container.addEventListener('mouseup', this);\n this.viewer.container.addEventListener('touchend', this);\n }\n\n override destroy() {\n this.__onMouseUp();\n\n this.viewer.container.removeEventListener('mouseup', this);\n this.viewer.container.removeEventListener('touchend', this);\n\n super.destroy();\n }\n\n handleEvent(e: Event) {\n // prettier-ignore\n switch (e.type) {\n case 'mousedown': this.__onMouseDown(); break;\n case 'mouseup': this.__onMouseUp(); break;\n case 'touchend': this.__onMouseUp(); break;\n case 'keydown': (e as KeyboardEvent).key === KEY_CODES.Enter && this.__onMouseDown(); break;\n case 'keyup': (e as KeyboardEvent).key === KEY_CODES.Enter && this.__onMouseUp(); break;\n }\n }\n\n onClick() {\n // nothing\n }\n\n override isSupported() {\n return invertResolvableBoolean(SYSTEM.isTouchEnabled);\n }\n\n private __onMouseDown() {\n if (!this.state.enabled) {\n return;\n }\n\n this.viewer.dynamics.zoom.roll(this.direction === ZoomButtonDirection.OUT);\n this.handler.down();\n }\n\n private __onMouseUp() {\n if (!this.state.enabled) {\n return;\n }\n\n this.handler.up(() => this.viewer.dynamics.zoom.stop());\n }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { ICONS } from '../data/constants';\nimport { AbstractZoomButton, ZoomButtonDirection } from './AbstractZoomButton';\n\nexport class ZoomInButton extends AbstractZoomButton {\n static override readonly id = 'zoomIn';\n\n constructor(navbar: Navbar) {\n super(navbar, ICONS.zoomIn, ZoomButtonDirection.IN);\n }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { ICONS } from '../data/constants';\nimport { AbstractZoomButton, ZoomButtonDirection } from './AbstractZoomButton';\n\nexport class ZoomOutButton extends AbstractZoomButton {\n static override readonly id = 'zoomOut';\n\n constructor(navbar: Navbar) {\n super(navbar, ICONS.zoomOut, ZoomButtonDirection.OUT);\n }\n}\n","import type { Navbar } from '../components/Navbar';\nimport { SYSTEM } from '../data/system';\nimport { ReadyEvent, ZoomUpdatedEvent } from '../events';\nimport { Slider, SliderDirection, SliderUpdateData, getStyleProperty, invertResolvableBoolean } from '../utils';\nimport { AbstractButton } from './AbstractButton';\n\nexport class ZoomRangeButton extends AbstractButton {\n static override readonly id = 'zoomRange';\n static override readonly groupId = 'zoom';\n\n private readonly slider: Slider;\n private readonly zoomRange: HTMLElement;\n private readonly zoomValue: HTMLElement;\n private readonly mediaMinWidth: number;\n\n constructor(navbar: Navbar) {\n super(navbar, {\n className: 'psv-zoom-range',\n hoverScale: false,\n collapsable: false,\n tabbable: false,\n });\n\n this.zoomRange = document.createElement('div');\n this.zoomRange.className = 'psv-zoom-range-line';\n this.container.appendChild(this.zoomRange);\n\n this.zoomValue = document.createElement('div');\n this.zoomValue.className = 'psv-zoom-range-handle';\n this.zoomRange.appendChild(this.zoomValue);\n\n this.slider = new Slider(this.container, SliderDirection.HORIZONTAL, (data) => this.__onSliderUpdate(data));\n\n this.mediaMinWidth = parseInt(getStyleProperty(this.container, 'max-width'), 10);\n\n this.viewer.addEventListener(ZoomUpdatedEvent.type, this);\n if (this.viewer.state.ready) {\n this.__moveZoomValue(this.viewer.getZoomLevel());\n } else {\n this.viewer.addEventListener(ReadyEvent.type, this);\n }\n }\n\n override destroy() {\n this.slider.destroy();\n\n this.viewer.removeEventListener(ZoomUpdatedEvent.type, this);\n this.viewer.removeEventListener(ReadyEvent.type, this);\n\n super.destroy();\n }\n\n handleEvent(e: Event) {\n if (e instanceof ZoomUpdatedEvent) {\n this.__moveZoomValue(e.zoomLevel);\n } else if (e instanceof ReadyEvent) {\n this.__moveZoomValue(this.viewer.getZoomLevel());\n }\n }\n\n onClick() {\n // nothing\n }\n\n override isSupported() {\n return invertResolvableBoolean(SYSTEM.isTouchEnabled);\n }\n\n override autoSize() {\n if (this.state.supported) {\n if (this.viewer.state.size.width <= this.mediaMinWidth && this.state.visible) {\n this.hide(false);\n } else if (this.viewer.state.size.width > this.mediaMinWidth && !this.state.visible) {\n this.show(false);\n }\n }\n }\n\n private __moveZoomValue(level: number) {\n this.zoomValue.style.left = (level / 100) * this.zoomRange.offsetWidth - this.zoomValue.offsetWidth / 2 + 'px';\n }\n\n private __onSliderUpdate(data: SliderUpdateData) {\n if (data.mousedown) {\n this.viewer.zoom(data.value * 100);\n }\n }\n}\n","import { MathUtils } from 'three';\nimport { adapterInterop } from '../adapters/AbstractAdapter';\nimport { EquirectangularAdapter } from '../adapters/EquirectangularAdapter';\nimport { ParsedViewerConfig, ReadonlyViewerConfig, ViewerConfig } from '../model';\nimport { pluginInterop } from '../plugins/AbstractPlugin';\nimport { PSVError } from '../PSVError';\nimport { clone, ConfigParsers, getConfigParser, logWarn, parseAngle } from '../utils';\nimport { ACTIONS, KEY_CODES } from './constants';\n\n/**\n * Default options\n */\nexport const DEFAULTS: Required = {\n panorama: null,\n overlay: null,\n overlayOpacity: 1,\n container: null,\n adapter: [EquirectangularAdapter as any, null],\n plugins: [],\n caption: null,\n description: null,\n downloadUrl: null,\n downloadName: null,\n loadingImg: null,\n loadingTxt: 'Loading...',\n size: null,\n fisheye: 0,\n minFov: 30,\n maxFov: 90,\n defaultZoomLvl: 50,\n defaultYaw: 0,\n defaultPitch: 0,\n sphereCorrection: null,\n moveSpeed: 1,\n zoomSpeed: 1,\n moveInertia: true,\n mousewheel: true,\n mousemove: true,\n mousewheelCtrlKey: false,\n touchmoveTwoFingers: false,\n useXmpData: null,\n panoData: null,\n requestHeaders: null,\n canvasBackground: null,\n rendererParameters: { alpha: true, antialias: true },\n withCredentials: false,\n // prettier-ignore\n navbar: [\n 'zoom',\n 'move',\n 'download',\n 'description',\n 'caption',\n 'fullscreen',\n ],\n lang: {\n zoom: 'Zoom',\n zoomOut: 'Zoom out',\n zoomIn: 'Zoom in',\n moveUp: 'Move up',\n moveDown: 'Move down',\n moveLeft: 'Move left',\n moveRight: 'Move right',\n download: 'Download',\n fullscreen: 'Fullscreen',\n menu: 'Menu',\n close: 'Close',\n twoFingers: 'Use two fingers to navigate',\n ctrlZoom: 'Use ctrl + scroll to zoom the image',\n loadError: \"The panorama can't be loaded\",\n },\n keyboard: 'fullscreen',\n keyboardActions: {\n [KEY_CODES.ArrowUp]: ACTIONS.ROTATE_UP,\n [KEY_CODES.ArrowDown]: ACTIONS.ROTATE_DOWN,\n [KEY_CODES.ArrowRight]: ACTIONS.ROTATE_RIGHT,\n [KEY_CODES.ArrowLeft]: ACTIONS.ROTATE_LEFT,\n [KEY_CODES.PageUp]: ACTIONS.ZOOM_IN,\n [KEY_CODES.PageDown]: ACTIONS.ZOOM_OUT,\n [KEY_CODES.Plus]: ACTIONS.ZOOM_IN,\n [KEY_CODES.Minus]: ACTIONS.ZOOM_OUT,\n },\n};\n\n/**\n * List of unmodifiable options and their error messages\n * @internal\n */\nexport const READONLY_OPTIONS: Record = {\n panorama: 'Use setPanorama method to change the panorama',\n panoData: 'Use setPanorama method to change the panorama',\n overlay: 'Use setOverlay method to changer the overlay',\n overlayOpacity: 'Use setOverlay method to changer the overlay',\n container: 'Cannot change viewer container',\n adapter: 'Cannot change adapter',\n plugins: 'Cannot change plugins',\n};\n\n/**\n * Parsers/validators for each option\n * @internal\n */\nexport const CONFIG_PARSERS: ConfigParsers = {\n container: (container) => {\n if (!container) {\n throw new PSVError('No value given for container.');\n }\n return container;\n },\n adapter: (adapter, { defValue }) => {\n if (!adapter) {\n adapter = defValue;\n } else if (Array.isArray(adapter)) {\n adapter = [adapterInterop(adapter[0]), adapter[1]];\n } else {\n adapter = [adapterInterop(adapter), null];\n }\n if (!adapter[0]) {\n throw new PSVError('An undefined value was given for adapter.');\n }\n if (!(adapter[0] as any).id) {\n throw new PSVError(`Adapter has no id.`);\n }\n return adapter;\n },\n overlayOpacity: (overlayOpacity) => {\n return MathUtils.clamp(overlayOpacity, 0, 1);\n },\n defaultYaw: (defaultYaw) => {\n // defaultYaw is between 0 and PI\n return parseAngle(defaultYaw);\n },\n defaultPitch: (defaultPitch) => {\n // defaultPitch is between -PI/2 and PI/2\n return parseAngle(defaultPitch, true);\n },\n defaultZoomLvl: (defaultZoomLvl) => {\n return MathUtils.clamp(defaultZoomLvl, 0, 100);\n },\n minFov: (minFov, { rawConfig }) => {\n // minFov and maxFov must be ordered\n if (rawConfig.maxFov < minFov) {\n logWarn('maxFov cannot be lower than minFov');\n minFov = rawConfig.maxFov;\n }\n // minFov between 1 and 179\n return MathUtils.clamp(minFov, 1, 179);\n },\n maxFov: (maxFov, { rawConfig }) => {\n // minFov and maxFov must be ordered\n if (maxFov < rawConfig.minFov) {\n maxFov = rawConfig.minFov;\n }\n // maxFov between 1 and 179\n return MathUtils.clamp(maxFov, 1, 179);\n },\n lang: (lang) => {\n if (Array.isArray(lang.twoFingers)) {\n logWarn('lang.twoFingers must not be an array');\n lang.twoFingers = lang.twoFingers[0];\n }\n return {\n ...DEFAULTS.lang,\n ...lang,\n };\n },\n keyboard: (keyboard) => {\n if (!keyboard) {\n return false;\n }\n if (typeof keyboard === 'object') {\n logWarn(`Use keyboardActions to configure the keyboard actions, keyboard option must be either true, false, 'fullscreen' or 'always'`);\n return 'fullscreen';\n }\n return keyboard === 'always' ? 'always' : 'fullscreen';\n },\n keyboardActions: (keyboardActions, { rawConfig }) => {\n if (rawConfig.keyboard && typeof rawConfig.keyboard === 'object') {\n return rawConfig.keyboard;\n }\n return keyboardActions;\n },\n fisheye: (fisheye) => {\n // translate boolean fisheye to amount\n if (fisheye === true) {\n return 1;\n } else if (fisheye === false) {\n return 0;\n }\n return fisheye;\n },\n requestHeaders: (requestHeaders) => {\n if (requestHeaders && typeof requestHeaders === 'object') {\n return () => requestHeaders;\n }\n if (typeof requestHeaders === 'function') {\n return requestHeaders;\n }\n return null;\n },\n rendererParameters: (rendererParameters, { defValue }) => ({\n ...rendererParameters,\n ...defValue,\n }),\n plugins: (plugins) => {\n return plugins.map((plugin, i) => {\n if (Array.isArray(plugin)) {\n plugin = [pluginInterop(plugin[0]), plugin[1]];\n } else {\n plugin = [pluginInterop(plugin), null];\n }\n if (!plugin[0]) {\n throw new PSVError(`An undefined value was given for plugin ${i}.`);\n }\n if (!(plugin[0] as any).id) {\n throw new PSVError(`Plugin ${i} has no id.`);\n }\n return plugin;\n });\n },\n navbar: (navbar) => {\n if (navbar === false) {\n return null;\n }\n if (navbar === true) {\n // true becomes the default array\n return clone(DEFAULTS.navbar as string[]);\n }\n if (typeof navbar === 'string') {\n // can be a space or coma separated list\n return navbar.split(/[ ,]/);\n }\n return navbar;\n },\n useXmpData: (useXmpData) => {\n if (useXmpData !== null) {\n logWarn(`Global useXmpData is deprecated, it is now configured on the adapter.`);\n }\n return useXmpData;\n },\n canvasBackground: (canvasBackground) => {\n if (canvasBackground !== null) {\n logWarn(`Global canvasBackground is deprecated, it is now configured on the adapter.`);\n }\n return canvasBackground;\n },\n};\n\n/**\n * @internal\n */\nexport const getViewerConfig = getConfigParser(DEFAULTS, CONFIG_PARSERS);\n","import { TypedEvent, TypedEventTarget } from '../lib/TypedEventTarget';\nimport { ConfigParser, logWarn } from '../utils';\nimport type { Viewer } from '../Viewer';\n\n/**\n * Base class for plugins\n * @template TEvents union of dispatched events\n */\nexport abstract class AbstractPlugin<\n TEvents extends TypedEvent = never\n> extends TypedEventTarget {\n /**\n * Unique identifier of the plugin\n */\n static readonly id: string;\n\n constructor(protected viewer: Viewer) {\n super();\n }\n\n /**\n * Initializes the plugin\n */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init(): void {}\n\n /**\n * Destroys the plugin\n */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n destroy(): void {}\n}\n\n/**\n * Base class for plugins with updatable configuration\n * The implementation must have a static `configParser` property which is the result of {@link utils.getConfigParser}\n *\n * @template TConfig type of input config\n * @template TParsedConfig type of config after parsing\n * @template TUpdatableConfig type of config that can be updated\n * @template TEvents union of dispatched events\n */\nexport abstract class AbstractConfigurablePlugin<\n TConfig extends Record,\n TParsedConfig extends TConfig = TConfig,\n TUpdatableConfig extends TConfig = TConfig,\n TEvents extends TypedEvent = never\n> extends AbstractPlugin {\n static configParser: ConfigParser;\n static readonlyOptions: string[] = [];\n\n readonly config: TParsedConfig;\n\n constructor(viewer: Viewer, config: TConfig) {\n super(viewer);\n\n this.config = (this.constructor as typeof AbstractConfigurablePlugin).configParser(config) as TParsedConfig;\n }\n\n /**\n * Update options\n */\n setOption(option: T, value: TUpdatableConfig[T]) {\n // @ts-ignore\n this.setOptions({ [option]: value });\n }\n\n /**\n * Update options\n */\n setOptions(options: Partial) {\n const rawConfig: TConfig = {\n ...this.config,\n ...options,\n };\n\n const ctor = this.constructor as typeof AbstractConfigurablePlugin;\n const parser: ConfigParser = ctor.configParser as any;\n const readonly = ctor.readonlyOptions;\n const id = ctor.id;\n\n for (let [key, value] of Object.entries(options) as Array<[keyof TConfig, any]>) {\n if (!(key in parser.defaults)) {\n logWarn(`${id}: Unknown option \"${key as string}\"`);\n continue;\n }\n\n if (readonly.includes(key as string)) {\n logWarn(`${id}: Option \"${key as string}\" cannot be updated`);\n continue;\n }\n\n if (key in parser.parsers) {\n value = parser.parsers[key](value, {\n rawConfig: rawConfig,\n defValue: parser.defaults[key],\n });\n }\n\n this.config[key] = value;\n }\n }\n}\n\nexport type PluginConstructor = new (viewer: Viewer, config?: any) => AbstractPlugin;\n\n/**\n * Returns the plugin constructor from the imported object\n * @internal\n */\nexport function pluginInterop(plugin: any): PluginConstructor & typeof AbstractPlugin {\n if (plugin) {\n for (const [, p] of [['_', plugin], ...Object.entries(plugin)]) {\n if (p.prototype instanceof AbstractPlugin) {\n return p;\n }\n }\n }\n return null;\n}\n","import { AbstractButton } from '../buttons/AbstractButton';\nimport { DescriptionButton } from '../buttons/DescriptionButton';\nimport type { Navbar } from './Navbar';\n\nexport class NavbarCaption extends AbstractButton {\n static override readonly id = 'caption';\n\n private contentWidth = 0;\n\n private readonly contentElt: HTMLElement;\n\n constructor(navbar: Navbar) {\n super(navbar, {\n className: 'psv-caption',\n hoverScale: false,\n collapsable: false,\n tabbable: true,\n });\n\n this.state.width = 0;\n\n this.contentElt = document.createElement('div');\n this.contentElt.className = 'psv-caption-content';\n this.container.appendChild(this.contentElt);\n\n this.setCaption(this.viewer.config.caption);\n }\n\n override hide() {\n this.contentElt.style.display = 'none';\n this.state.visible = false;\n }\n\n override show() {\n this.contentElt.style.display = '';\n this.state.visible = true;\n }\n\n onClick(): void {\n // nothing\n }\n\n /**\n * Changes the caption\n */\n setCaption(html: string) {\n this.show();\n this.contentElt.innerHTML = html ?? '';\n\n if (this.contentElt.innerHTML) {\n this.contentWidth = this.contentElt.offsetWidth;\n } else {\n this.contentWidth = 0;\n }\n\n this.autoSize();\n }\n\n /**\n * Toggles content and icon depending on available space\n */\n override autoSize() {\n this.toggle(this.container.offsetWidth >= this.contentWidth);\n this.__refreshButton();\n }\n\n private __refreshButton() {\n (this.viewer.navbar.getButton(DescriptionButton.id, false) as DescriptionButton)?.autoSize(true);\n }\n}\n","import { AbstractButton, ButtonConstructor } from '../buttons/AbstractButton';\nimport { CustomButton } from '../buttons/CustomButton';\nimport { DescriptionButton } from '../buttons/DescriptionButton';\nimport { DownloadButton } from '../buttons/DownloadButton';\nimport { FullscreenButton } from '../buttons/FullscreenButton';\nimport { MenuButton } from '../buttons/MenuButton';\nimport { MoveDownButton } from '../buttons/MoveDownButton';\nimport { MoveLeftButton } from '../buttons/MoveLeftButton';\nimport { MoveRightButton } from '../buttons/MoveRightButton';\nimport { MoveUpButton } from '../buttons/MoveUpButton';\nimport { ZoomInButton } from '../buttons/ZoomInButton';\nimport { ZoomOutButton } from '../buttons/ZoomOutButton';\nimport { ZoomRangeButton } from '../buttons/ZoomRangeButton';\nimport { DEFAULTS } from '../data/config';\nimport { CAPTURE_EVENTS_CLASS } from '../data/constants';\nimport { ParsedViewerConfig } from '../model';\nimport { PSVError } from '../PSVError';\nimport { logWarn } from '../utils';\nimport type { Viewer } from '../Viewer';\nimport { AbstractComponent } from './AbstractComponent';\nimport { NavbarCaption } from './NavbarCaption';\n\n/**\n * List of available buttons\n */\nconst AVAILABLE_BUTTONS: Record = {};\n\n/**\n * List of available buttons\n */\nconst AVAILABLE_GROUPS: Record = {};\n\n/**\n * Register a new button available for all viewers\n * @param button\n * @param [defaultPosition] If provided the default configuration of the navbar will be modified.\n * Possible values are :\n * - `start`\n * - `end`\n * - `[id]:left`\n * - `[id]:right`\n * @throws {@link PSVError} if the button constructor has no \"id\"\n */\nexport function registerButton(button: ButtonConstructor, defaultPosition?: string) {\n if (!button.id) {\n throw new PSVError('Button id is required');\n }\n\n AVAILABLE_BUTTONS[button.id] = button;\n\n if (button.groupId) {\n (AVAILABLE_GROUPS[button.groupId] = AVAILABLE_GROUPS[button.groupId] || []).push(button);\n }\n\n if (defaultPosition) {\n const navbar = DEFAULTS.navbar as string[];\n switch (defaultPosition) {\n case 'start':\n navbar.unshift(button.id);\n break;\n case 'end':\n navbar.push(button.id);\n break;\n default: {\n const [id, pos] = defaultPosition.split(':');\n const idx = navbar.indexOf(id);\n if (!id || !pos || idx === -1) {\n throw new PSVError(`Invalid defaultPosition ${defaultPosition}`);\n }\n navbar.splice(idx + (pos === 'right' ? 1 : 0), 0, button.id);\n }\n }\n }\n}\n\n[\n ZoomOutButton,\n ZoomRangeButton,\n ZoomInButton,\n DescriptionButton,\n NavbarCaption,\n DownloadButton,\n FullscreenButton,\n MoveLeftButton,\n MoveRightButton,\n MoveUpButton,\n MoveDownButton,\n].forEach((btn) => registerButton(btn));\n\n/**\n * Navigation bar component\n */\nexport class Navbar extends AbstractComponent {\n /**\n * @internal\n */\n collapsed: AbstractButton[] = [];\n\n /**\n * @internal\n */\n constructor(viewer: Viewer) {\n super(viewer, {\n className: `psv-navbar ${CAPTURE_EVENTS_CLASS}`,\n });\n\n this.state.visible = false;\n }\n\n /**\n * Shows the navbar\n */\n override show() {\n this.viewer.container.classList.add('psv--has-navbar');\n this.container.classList.add('psv-navbar--open');\n this.state.visible = true;\n }\n\n /**\n * Hides the navbar\n */\n override hide() {\n this.viewer.container.classList.remove('psv--has-navbar');\n this.container.classList.remove('psv-navbar--open');\n this.state.visible = false;\n }\n\n /**\n * Change the buttons visible on the navbar\n */\n setButtons(buttons: ParsedViewerConfig['navbar']) {\n this.children.slice().forEach((item) => item.destroy());\n this.children.length = 0;\n\n // force description button if caption is present (used on narrow screens)\n if (buttons.indexOf(NavbarCaption.id) !== -1 && buttons.indexOf(DescriptionButton.id) === -1) {\n buttons.splice(buttons.indexOf(NavbarCaption.id), 0, DescriptionButton.id);\n }\n\n buttons.forEach((button) => {\n if (typeof button === 'object') {\n new CustomButton(this, button);\n } else if (AVAILABLE_BUTTONS[button]) {\n // @ts-ignore\n new AVAILABLE_BUTTONS[button](this);\n } else if (AVAILABLE_GROUPS[button]) {\n AVAILABLE_GROUPS[button].forEach((buttonCtor) => {\n // @ts-ignore\n new buttonCtor(this);\n });\n } else {\n logWarn(`Unknown button ${button}`);\n }\n });\n\n new MenuButton(this);\n\n this.children.forEach((item) => {\n if (item instanceof AbstractButton) {\n item.checkSupported();\n }\n });\n\n this.autoSize();\n }\n\n /**\n * Changes the navbar caption\n */\n setCaption(html: string) {\n this.children.some((item) => {\n if (item instanceof NavbarCaption) {\n item.setCaption(html);\n return true;\n } else {\n return false;\n }\n });\n }\n\n /**\n * Returns a button by its identifier\n */\n getButton(id: string, warnNotFound = true): AbstractButton {\n const button = this.children.find((item) => {\n return item instanceof AbstractButton && item.id === id;\n });\n\n if (!button && warnNotFound) {\n logWarn(`button \"${id}\" not found in the navbar`);\n }\n\n return button as AbstractButton;\n }\n\n /**\n * Automatically collapses buttons\n * @internal\n */\n autoSize() {\n this.children.forEach((child) => {\n if (child instanceof AbstractButton) {\n child.autoSize();\n }\n });\n\n const availableWidth = this.container.offsetWidth;\n\n let totalWidth = 0;\n const collapsableButtons: AbstractButton[] = [];\n\n this.children.forEach((item) => {\n if (item.isVisible() && item instanceof AbstractButton) {\n totalWidth += item.width;\n if (item.collapsable) {\n collapsableButtons.push(item);\n }\n }\n });\n\n if (totalWidth === 0) {\n return;\n }\n\n if (availableWidth < totalWidth && collapsableButtons.length > 0) {\n collapsableButtons.forEach((item) => item.collapse());\n this.collapsed = collapsableButtons;\n\n this.getButton(MenuButton.id).show(false);\n } else if (availableWidth >= totalWidth && this.collapsed.length > 0) {\n this.collapsed.forEach((item) => item.uncollapse());\n this.collapsed = [];\n\n this.getButton(MenuButton.id).hide(false);\n }\n\n this.getButton(NavbarCaption.id, false)?.autoSize();\n }\n}\n","import { ConfigChangedEvent, LoadProgressEvent } from '../events';\nimport { getStyleProperty } from '../utils';\nimport type { Viewer } from '../Viewer';\nimport { AbstractComponent } from './AbstractComponent';\n\n/**\n * Loader component\n */\nexport class Loader extends AbstractComponent {\n private readonly loader: HTMLElement;\n private readonly canvas: SVGElement;\n\n private readonly size: number;\n private readonly border: number;\n private readonly thickness: number;\n private readonly color: string;\n private readonly textColor: string;\n\n /**\n * @internal\n */\n constructor(viewer: Viewer) {\n super(viewer, { className: 'psv-loader-container' });\n\n this.loader = document.createElement('div');\n this.loader.className = 'psv-loader';\n this.container.appendChild(this.loader);\n\n this.size = this.loader.offsetWidth;\n\n this.canvas = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.canvas.setAttribute('class', 'psv-loader-canvas');\n this.canvas.setAttribute('viewBox', `0 0 ${this.size} ${this.size}`);\n this.loader.appendChild(this.canvas);\n\n this.textColor = getStyleProperty(this.loader, 'color');\n this.color = getStyleProperty(this.canvas, 'color');\n this.border = parseInt(getStyleProperty(this.loader, '--psv-loader-border'), 10);\n this.thickness = parseInt(getStyleProperty(this.loader, '--psv-loader-tickness'), 10);\n\n this.viewer.addEventListener(ConfigChangedEvent.type, this);\n\n this.__updateContent();\n this.hide();\n }\n\n /**\n * @internal\n */\n override destroy(): void {\n this.viewer.removeEventListener(ConfigChangedEvent.type, this);\n\n super.destroy();\n }\n\n /**\n * @internal\n */\n handleEvent(e: Event) {\n if (e instanceof ConfigChangedEvent) {\n e.containsOptions('loadingImg', 'loadingTxt') && this.__updateContent();\n }\n }\n\n /**\n * Sets the loader progression\n */\n setProgress(value: number) {\n const angle = (Math.min(value, 99.999) / 100) * Math.PI * 2;\n const halfSize = this.size / 2;\n const startX = halfSize;\n const startY = this.thickness / 2 + this.border;\n const radius = (this.size - this.thickness) / 2 - this.border;\n const endX = Math.sin(angle) * radius + halfSize;\n const endY = -Math.cos(angle) * radius + halfSize;\n const largeArc = value > 50 ? '1' : '0';\n\n this.canvas.innerHTML = `\n \n \n `;\n\n this.viewer.dispatchEvent(new LoadProgressEvent(Math.round(value)));\n }\n\n private __updateContent() {\n const current = this.loader.querySelector('.psv-loader-image, .psv-loader-text');\n if (current) {\n this.loader.removeChild(current);\n }\n\n let inner;\n if (this.viewer.config.loadingImg) {\n inner = document.createElement('img');\n inner.className = 'psv-loader-image';\n inner.src = this.viewer.config.loadingImg;\n } else if (this.viewer.config.loadingTxt) {\n inner = document.createElement('div');\n inner.className = 'psv-loader-text';\n inner.innerHTML = this.viewer.config.loadingTxt;\n }\n if (inner) {\n const size = Math.round(Math.sqrt(2 * Math.pow(this.size / 2 - this.thickness / 2 - this.border, 2)));\n inner.style.maxWidth = size + 'px';\n inner.style.maxHeight = size + 'px';\n this.loader.appendChild(inner);\n }\n }\n}\n","import { PSVError } from '../PSVError';\nimport type { Viewer } from '../Viewer';\nimport { HideNotificationEvent, ShowNotificationEvent } from '../events';\nimport { AbstractComponent } from './AbstractComponent';\n\n/**\n * Configuration for {@link Notification.show}\n */\nexport type NotificationConfig = {\n /**\n * unique identifier to use with {@link Notification.hide} and {@link Notification.isVisible}\n */\n id?: string;\n /**\n * notification content\n */\n content: string;\n /**\n * automatically hide the notification after X milliseconds\n */\n timeout?: number;\n};\n\n/**\n * Notification component\n */\nexport class Notification extends AbstractComponent {\n /**\n * @internal\n */\n protected override readonly state = {\n visible: false,\n contentId: null as string,\n timeout: null as ReturnType,\n };\n\n private readonly content: HTMLElement;\n\n /**\n * @internal\n */\n constructor(viewer: Viewer) {\n super(viewer, {\n className: 'psv-notification',\n });\n\n this.content = document.createElement('div');\n this.content.className = 'psv-notification-content';\n this.container.appendChild(this.content);\n\n this.content.addEventListener('click', () => this.hide());\n }\n\n /**\n * Checks if the notification is visible\n */\n override isVisible(id?: string) {\n return this.state.visible && (!id || !this.state.contentId || this.state.contentId === id);\n }\n\n /**\n * @throws {@link PSVError} always\n * @internal\n */\n override toggle() {\n throw new PSVError('Notification cannot be toggled');\n }\n\n /**\n * Displays a notification on the viewer\n *\n * @example\n * viewer.showNotification({ content: 'Hello world', timeout: 5000 })\n * @example\n * viewer.showNotification('Hello world')\n */\n override show(config: string | NotificationConfig) {\n if (this.state.timeout) {\n clearTimeout(this.state.timeout);\n this.state.timeout = null;\n }\n\n if (typeof config === 'string') {\n config = { content: config };\n }\n\n this.state.contentId = config.id || null;\n this.content.innerHTML = config.content;\n\n this.container.classList.add('psv-notification--visible');\n this.state.visible = true;\n\n this.viewer.dispatchEvent(new ShowNotificationEvent(config.id));\n\n if (config.timeout) {\n this.state.timeout = setTimeout(() => this.hide(this.state.contentId), config.timeout);\n }\n }\n\n /**\n * Hides the notification\n */\n override hide(id?: string) {\n if (this.isVisible(id)) {\n const contentId = this.state.contentId;\n\n this.container.classList.remove('psv-notification--visible');\n this.state.visible = false;\n\n this.state.contentId = null;\n\n this.viewer.dispatchEvent(new HideNotificationEvent(contentId));\n }\n }\n}\n","import { CAPTURE_EVENTS_CLASS, KEY_CODES } from '../data/constants';\nimport { PSVError } from '../PSVError';\nimport type { Viewer } from '../Viewer';\nimport { HideOverlayEvent, KeypressEvent, ShowOverlayEvent } from '../events';\nimport { AbstractComponent } from './AbstractComponent';\n\n/**\n * Configuration for {@link Overlay.show}\n */\nexport type OverlayConfig = {\n /**\n * unique identifier to use with {@link Overlay.hide} and {@link Overlay.isVisible}\n */\n id?: string;\n /**\n * SVG image/icon displayed above the text\n */\n image?: string;\n /**\n * main message\n */\n title: string;\n /**\n * secondary message\n */\n text?: string;\n /**\n * if the user can hide the overlay by clicking\n * @default true\n */\n dissmisable?: boolean;\n};\n\n/**\n * Overlay component\n */\nexport class Overlay extends AbstractComponent {\n /**\n * @internal\n */\n protected override readonly state = {\n visible: false,\n contentId: null as string,\n dissmisable: true,\n };\n\n private readonly image: HTMLElement;\n private readonly title: HTMLElement;\n private readonly text: HTMLElement;\n\n /**\n * @internal\n */\n constructor(viewer: Viewer) {\n super(viewer, {\n className: `psv-overlay ${CAPTURE_EVENTS_CLASS}`,\n });\n\n this.image = document.createElement('div');\n this.image.className = 'psv-overlay-image';\n this.container.appendChild(this.image);\n\n this.title = document.createElement('div');\n this.title.className = 'psv-overlay-title';\n this.container.appendChild(this.title);\n\n this.text = document.createElement('div');\n this.text.className = 'psv-overlay-text';\n this.container.appendChild(this.text);\n\n this.container.addEventListener('click', this);\n this.viewer.addEventListener(KeypressEvent.type, this);\n\n super.hide();\n }\n\n /**\n * @internal\n */\n override destroy() {\n this.viewer.removeEventListener(KeypressEvent.type, this);\n\n super.destroy();\n }\n\n /**\n * @internal\n */\n handleEvent(e: Event) {\n if (e.type === 'click') {\n if (this.isVisible() && this.state.dissmisable) {\n this.hide();\n e.stopPropagation();\n }\n } else if (e instanceof KeypressEvent) {\n if (this.isVisible() && this.state.dissmisable && e.key === KEY_CODES.Escape) {\n this.hide();\n e.preventDefault();\n }\n }\n }\n\n /**\n * Checks if the overlay is visible\n */\n override isVisible(id?: string) {\n return this.state.visible && (!id || !this.state.contentId || this.state.contentId === id);\n }\n\n /**\n * @throws {@link PSVError} always\n * @internal\n */\n override toggle() {\n throw new PSVError('Overlay cannot be toggled');\n }\n\n /**\n * Displays an overlay on the viewer\n */\n override show(config: string | OverlayConfig) {\n if (typeof config === 'string') {\n config = { title: config };\n }\n\n this.state.contentId = config.id || null;\n this.state.dissmisable = config.dissmisable !== false;\n this.image.innerHTML = config.image || '';\n this.title.innerHTML = config.title || '';\n this.text.innerHTML = config.text || '';\n\n super.show();\n\n this.viewer.dispatchEvent(new ShowOverlayEvent(config.id));\n }\n\n /**\n * Hides the overlay\n */\n override hide(id?: string) {\n if (this.isVisible(id)) {\n const contentId = this.state.contentId;\n\n super.hide();\n\n this.state.contentId = null;\n\n this.viewer.dispatchEvent(new HideOverlayEvent(contentId));\n }\n }\n}\n","import { CAPTURE_EVENTS_CLASS, ICONS, KEY_CODES } from '../data/constants';\nimport { PSVError } from '../PSVError';\nimport { toggleClass } from '../utils';\nimport type { Viewer } from '../Viewer';\nimport { HidePanelEvent, KeypressEvent, ShowPanelEvent } from '../events';\nimport { AbstractComponent } from './AbstractComponent';\n\nconst PANEL_MIN_WIDTH = 200;\n\nconst PANEL_CLASS_NO_INTERACTION = 'psv-panel-content--no-interaction';\n\n/**\n * Configuration for {@link Panel.show}\n */\nexport type PanelConfig = {\n /**\n * unique identifier to use with {@link Panel.hide} and {@link Panel.isVisible} and to store the width\n */\n id?: string;\n /**\n * HTML content of the panel\n */\n content: string;\n /**\n * remove the default margins\n * @default false\n */\n noMargin?: boolean;\n /**\n * initial width\n */\n width?: string;\n /**\n * called when the user clicks inside the panel or presses the Enter key while an element focused\n */\n clickHandler?: (target: HTMLElement) => void;\n};\n\n/**\n * Panel component\n */\nexport class Panel extends AbstractComponent {\n /**\n * @internal\n */\n protected override readonly state = {\n visible: false,\n contentId: null as string,\n mouseX: 0,\n mouseY: 0,\n mousedown: false,\n clickHandler: null as (e: MouseEvent) => void,\n keyHandler: null as (e: KeyboardEvent) => void,\n width: {} as Record,\n };\n\n private readonly content: HTMLElement;\n\n /**\n * @internal\n */\n constructor(viewer: Viewer) {\n super(viewer, {\n className: `psv-panel ${CAPTURE_EVENTS_CLASS}`,\n });\n\n const resizer = document.createElement('div');\n resizer.className = 'psv-panel-resizer';\n this.container.appendChild(resizer);\n\n const closeBtn = document.createElement('div');\n closeBtn.className = 'psv-panel-close-button';\n closeBtn.innerHTML = ICONS.close;\n closeBtn.title = viewer.config.lang.close;\n this.container.appendChild(closeBtn);\n\n this.content = document.createElement('div');\n this.content.className = 'psv-panel-content';\n this.container.appendChild(this.content);\n\n // Stop wheel event bubbling from panel\n this.container.addEventListener('wheel', (e) => e.stopPropagation());\n\n closeBtn.addEventListener('click', () => this.hide());\n\n // Event for panel resizing + stop bubling\n resizer.addEventListener('mousedown', this);\n resizer.addEventListener('touchstart', this);\n this.viewer.container.addEventListener('mouseup', this);\n this.viewer.container.addEventListener('touchend', this);\n this.viewer.container.addEventListener('mousemove', this);\n this.viewer.container.addEventListener('touchmove', this);\n\n this.viewer.addEventListener(KeypressEvent.type, this);\n }\n\n /**\n * @internal\n */\n override destroy() {\n this.viewer.removeEventListener(KeypressEvent.type, this);\n\n this.viewer.container.removeEventListener('mousemove', this);\n this.viewer.container.removeEventListener('touchmove', this);\n this.viewer.container.removeEventListener('mouseup', this);\n this.viewer.container.removeEventListener('touchend', this);\n\n super.destroy();\n }\n\n /**\n * @internal\n */\n handleEvent(e: Event) {\n // prettier-ignore\n switch (e.type) {\n case 'mousedown': this.__onMouseDown(e as MouseEvent); break;\n case 'touchstart': this.__onTouchStart(e as TouchEvent); break;\n case 'mousemove': this.__onMouseMove(e as MouseEvent); break;\n case 'touchmove': this.__onTouchMove(e as TouchEvent); break;\n case 'mouseup': this.__onMouseUp(e as MouseEvent); break;\n case 'touchend': this.__onTouchEnd(e as TouchEvent); break;\n case KeypressEvent.type: this.__onKeyPress(e as KeypressEvent); break;\n }\n }\n\n /**\n * Checks if the panel is visible\n */\n override isVisible(id?: string) {\n return this.state.visible && (!id || !this.state.contentId || this.state.contentId === id);\n }\n\n /**\n * @throws {@link PSVError} always\n * @internal\n */\n override toggle() {\n throw new PSVError('Panel cannot be toggled');\n }\n\n /**\n * Shows the panel\n */\n override show(config: string | PanelConfig) {\n if (typeof config === 'string') {\n config = { content: config };\n }\n const wasVisible = this.isVisible(config.id);\n\n this.state.contentId = config.id || null;\n this.state.visible = true;\n\n if (this.state.clickHandler) {\n this.content.removeEventListener('click', this.state.clickHandler);\n this.content.removeEventListener('keydown', this.state.keyHandler);\n this.state.clickHandler = null;\n this.state.keyHandler = null;\n }\n\n if (config.id && this.state.width[config.id]) {\n this.container.style.width = this.state.width[config.id];\n } else if (config.width) {\n this.container.style.width = config.width;\n } else {\n this.container.style.width = null;\n }\n\n this.content.innerHTML = config.content;\n this.content.scrollTop = 0;\n this.container.classList.add('psv-panel--open');\n\n toggleClass(this.content, 'psv-panel-content--no-margin', config.noMargin === true);\n\n if (config.clickHandler) {\n this.state.clickHandler = (e) => {\n (config as PanelConfig).clickHandler(e.target as HTMLElement);\n };\n this.state.keyHandler = (e) => {\n if (e.key === KEY_CODES.Enter) {\n (config as PanelConfig).clickHandler(e.target as HTMLElement);\n }\n };\n this.content.addEventListener('click', this.state.clickHandler);\n this.content.addEventListener('keydown', this.state.keyHandler);\n\n // focus the first element if possible, after animation ends\n if (!wasVisible) {\n setTimeout(() => {\n (this.content.querySelector('a,button,[tabindex]') as HTMLElement)?.focus();\n }, 300);\n }\n }\n\n this.viewer.dispatchEvent(new ShowPanelEvent(config.id));\n }\n\n /**\n * Hides the panel\n */\n override hide(id?: string) {\n if (this.isVisible(id)) {\n const contentId = this.state.contentId;\n\n this.state.visible = false;\n this.state.contentId = null;\n\n this.content.innerHTML = null;\n this.container.classList.remove('psv-panel--open');\n\n if (this.state.clickHandler) {\n this.content.removeEventListener('click', this.state.clickHandler);\n this.state.clickHandler = null;\n }\n\n this.viewer.dispatchEvent(new HidePanelEvent(contentId));\n }\n }\n\n private __onMouseDown(evt: MouseEvent) {\n evt.stopPropagation();\n this.__startResize(evt.clientX, evt.clientY);\n }\n\n private __onTouchStart(evt: TouchEvent) {\n evt.stopPropagation();\n if (evt.touches.length === 1) {\n const touch = evt.touches[0];\n this.__startResize(touch.clientX, touch.clientY);\n }\n }\n\n private __onMouseUp(evt: MouseEvent) {\n if (this.state.mousedown) {\n evt.stopPropagation();\n this.state.mousedown = false;\n this.content.classList.remove(PANEL_CLASS_NO_INTERACTION);\n }\n }\n\n private __onTouchEnd(evt: TouchEvent) {\n if (this.state.mousedown) {\n evt.stopPropagation();\n if (evt.touches.length === 0) {\n this.state.mousedown = false;\n this.content.classList.remove(PANEL_CLASS_NO_INTERACTION);\n }\n }\n }\n\n private __onMouseMove(evt: MouseEvent) {\n if (this.state.mousedown) {\n evt.stopPropagation();\n this.__resize(evt.clientX, evt.clientY);\n }\n }\n\n private __onTouchMove(evt: TouchEvent) {\n if (this.state.mousedown) {\n const touch = evt.touches[0];\n this.__resize(touch.clientX, touch.clientY);\n }\n }\n\n private __onKeyPress(evt: KeypressEvent) {\n if (this.isVisible() && evt.key === KEY_CODES.Escape) {\n this.hide();\n evt.preventDefault();\n }\n }\n\n private __startResize(clientX: number, clientY: number) {\n this.state.mouseX = clientX;\n this.state.mouseY = clientY;\n this.state.mousedown = true;\n this.content.classList.add(PANEL_CLASS_NO_INTERACTION);\n }\n\n private __resize(clientX: number, clientY: number) {\n const x = clientX;\n const y = clientY;\n const width = Math.max(PANEL_MIN_WIDTH, this.container.offsetWidth - (x - this.state.mouseX)) + 'px';\n\n if (this.state.contentId) {\n this.state.width[this.state.contentId] = width;\n }\n\n this.container.style.width = width;\n\n this.state.mouseX = x;\n this.state.mouseY = y;\n }\n}\n","import { PSVError } from '../PSVError';\nimport type { Viewer } from '../Viewer';\nimport { HideTooltipEvent, ShowTooltipEvent } from '../events';\nimport { addClasses, cleanCssPosition, cssPositionIsOrdered, getStyleProperty } from '../utils';\nimport { AbstractComponent } from './AbstractComponent';\n\n/**\n * Object defining the tooltip position\n */\nexport type TooltipPosition = {\n /**\n * Position of the tip of the arrow of the tooltip, in pixels\n */\n top: number;\n /**\n * Position of the tip of the arrow of the tooltip, in pixels\n */\n left: number;\n /**\n * Tooltip position toward it's arrow tip.\n * Accepted values are combinations of `top`, `center`, `bottom` and `left`, `center`, `right`.\n */\n position?: string | [string, string];\n /**\n * @internal\n */\n box?: { width: number; height: number };\n};\n\n/**\n * Configuration for {@link Viewer.createTooltip}\n */\nexport type TooltipConfig = TooltipPosition & {\n /**\n * HTML content of the tooltip\n */\n content: string;\n /**\n * Additional CSS class added to the tooltip\n */\n className?: string;\n /**\n * CSS properties added to the tooltip\n */\n style?: Record;\n /**\n * Userdata associated to the tooltip\n */\n data?: any;\n};\n\ntype TooltipStyle = {\n posClass: [string, string];\n width: number;\n height: number;\n top: number;\n left: number;\n arrowTop: number;\n arrowLeft: number;\n};\n\nconst enum TooltipState {\n NONE,\n SHOWING,\n HIDING,\n READY,\n}\n\n/**\n * Tooltip component\n * @description Never instanciate tooltips directly use {@link Viewer#createTooltip} instead\n */\nexport class Tooltip extends AbstractComponent {\n /**\n * @internal\n */\n protected override readonly state = {\n visible: true,\n arrow: 0,\n border: 0,\n state: TooltipState.NONE,\n width: 0,\n height: 0,\n pos: '',\n config: null as TooltipPosition,\n data: null as any,\n };\n\n private readonly content: HTMLElement;\n private readonly arrow: HTMLElement;\n\n /**\n * @internal\n */\n constructor(viewer: Viewer, config: TooltipConfig) {\n super(viewer, {\n className: 'psv-tooltip',\n });\n\n this.content = document.createElement('div');\n this.content.className = 'psv-tooltip-content';\n this.container.appendChild(this.content);\n\n this.arrow = document.createElement('div');\n this.arrow.className = 'psv-tooltip-arrow';\n this.container.appendChild(this.arrow);\n\n this.container.addEventListener('transitionend', this);\n\n // allows to interact with static tooltips\n this.container.addEventListener('touchdown', (e) => e.stopPropagation());\n this.container.addEventListener('mousedown', (e) => e.stopPropagation());\n\n this.container.style.top = '-1000px';\n this.container.style.left = '-1000px';\n\n this.show(config);\n }\n\n /**\n * @internal\n */\n handleEvent(e: Event) {\n if (e.type === 'transitionend') {\n this.__onTransitionEnd(e as TransitionEvent);\n }\n }\n\n /**\n * @internal\n */\n override destroy() {\n delete this.state.data;\n super.destroy();\n }\n\n /**\n * @throws {@link PSVError} always\n * @internal\n */\n override toggle() {\n throw new PSVError('Tooltip cannot be toggled');\n }\n\n /**\n * Displays the tooltip on the viewer\n * @internal\n */\n override show(config: TooltipConfig) {\n if (this.state.state !== TooltipState.NONE) {\n throw new PSVError('Initialized tooltip cannot be re-initialized');\n }\n\n if (config.className) {\n addClasses(this.container, config.className);\n }\n if (config.style) {\n Object.assign(this.container.style, config.style);\n }\n\n this.state.state = TooltipState.READY;\n\n this.update(config.content, config);\n\n this.state.data = config.data;\n this.state.state = TooltipState.SHOWING;\n\n this.viewer.dispatchEvent(new ShowTooltipEvent(this, this.state.data));\n\n this.__waitImages();\n }\n\n /**\n * Updates the content of the tooltip, optionally with a new position\n * @throws {@link PSVError} if the configuration is invalid\n */\n update(content: string, config?: TooltipPosition) {\n this.content.innerHTML = content;\n\n const rect = this.container.getBoundingClientRect();\n this.state.width = rect.right - rect.left;\n this.state.height = rect.bottom - rect.top;\n this.state.arrow = parseInt(getStyleProperty(this.arrow, 'border-top-width'), 10);\n this.state.border = parseInt(getStyleProperty(this.container, 'border-top-left-radius'), 10);\n\n this.move(config ?? this.state.config);\n }\n\n /**\n * Moves the tooltip to a new position\n * @throws {@link PSVError} if the configuration is invalid\n */\n move(config: TooltipPosition) {\n if (this.state.state !== TooltipState.SHOWING && this.state.state !== TooltipState.READY) {\n throw new PSVError('Uninitialized tooltip cannot be moved');\n }\n\n config.box = config.box ?? this.state.config?.box ?? { width: 0, height: 0 };\n this.state.config = config;\n\n const t = this.container;\n const a = this.arrow;\n\n // compute size\n const style: TooltipStyle = {\n posClass: cleanCssPosition(config.position, { allowCenter: false, cssOrder: false }) || ['top', 'center'],\n width: this.state.width,\n height: this.state.height,\n top: 0,\n left: 0,\n arrowTop: 0,\n arrowLeft: 0,\n };\n\n // set initial position\n this.__computeTooltipPosition(style, config);\n\n // correct position if overflow\n let swapY = null;\n let swapX = null;\n if (style.top < 0) {\n swapY = 'bottom';\n } else if (style.top + style.height > this.viewer.state.size.height) {\n swapY = 'top';\n }\n if (style.left < 0) {\n swapX = 'right';\n } else if (style.left + style.width > this.viewer.state.size.width) {\n swapX = 'left';\n }\n if (swapX || swapY) {\n const ordered = cssPositionIsOrdered(style.posClass);\n if (swapY) {\n style.posClass[ordered ? 0 : 1] = swapY;\n }\n if (swapX) {\n style.posClass[ordered ? 1 : 0] = swapX;\n }\n this.__computeTooltipPosition(style, config);\n }\n\n // apply position\n t.style.top = style.top + 'px';\n t.style.left = style.left + 'px';\n\n a.style.top = style.arrowTop + 'px';\n a.style.left = style.arrowLeft + 'px';\n\n const newPos = style.posClass.join('-');\n if (newPos !== this.state.pos) {\n t.classList.remove(`psv-tooltip--${this.state.pos}`);\n\n this.state.pos = newPos;\n t.classList.add(`psv-tooltip--${this.state.pos}`);\n }\n }\n\n /**\n * Hides the tooltip\n */\n override hide() {\n this.container.classList.remove('psv-tooltip--visible');\n this.state.state = TooltipState.HIDING;\n\n this.viewer.dispatchEvent(new HideTooltipEvent(this.state.data));\n }\n\n /**\n * Finalize transition\n */\n private __onTransitionEnd(e: TransitionEvent) {\n if (e.propertyName === 'transform') {\n switch (this.state.state) {\n case TooltipState.SHOWING:\n this.container.classList.add('psv-tooltip--visible');\n this.state.state = TooltipState.READY;\n break;\n\n case TooltipState.HIDING:\n this.state.state = TooltipState.NONE;\n this.destroy();\n break;\n\n default:\n // nothing\n }\n }\n }\n\n /**\n * Computes the position of the tooltip and its arrow\n */\n private __computeTooltipPosition(style: TooltipStyle, config: TooltipPosition) {\n const arrow = this.state.arrow;\n const top = config.top;\n const height = style.height;\n const left = config.left;\n const width = style.width;\n const offsetSide = arrow + this.state.border;\n const offsetX = config.box.width / 2 + arrow * 2;\n const offsetY = config.box.height / 2 + arrow * 2;\n\n switch (style.posClass.join('-')) {\n case 'top-left':\n style.top = top - offsetY - height;\n style.left = left + offsetSide - width;\n style.arrowTop = height;\n style.arrowLeft = width - offsetSide - arrow;\n break;\n case 'top-center':\n style.top = top - offsetY - height;\n style.left = left - width / 2;\n style.arrowTop = height;\n style.arrowLeft = width / 2 - arrow;\n break;\n case 'top-right':\n style.top = top - offsetY - height;\n style.left = left - offsetSide;\n style.arrowTop = height;\n style.arrowLeft = arrow;\n break;\n case 'bottom-left':\n style.top = top + offsetY;\n style.left = left + offsetSide - width;\n style.arrowTop = -arrow * 2;\n style.arrowLeft = width - offsetSide - arrow;\n break;\n case 'bottom-center':\n style.top = top + offsetY;\n style.left = left - width / 2;\n style.arrowTop = -arrow * 2;\n style.arrowLeft = width / 2 - arrow;\n break;\n case 'bottom-right':\n style.top = top + offsetY;\n style.left = left - offsetSide;\n style.arrowTop = -arrow * 2;\n style.arrowLeft = arrow;\n break;\n case 'left-top':\n style.top = top + offsetSide - height;\n style.left = left - offsetX - width;\n style.arrowTop = height - offsetSide - arrow;\n style.arrowLeft = width;\n break;\n case 'center-left':\n style.top = top - height / 2;\n style.left = left - offsetX - width;\n style.arrowTop = height / 2 - arrow;\n style.arrowLeft = width;\n break;\n case 'left-bottom':\n style.top = top - offsetSide;\n style.left = left - offsetX - width;\n style.arrowTop = arrow;\n style.arrowLeft = width;\n break;\n case 'right-top':\n style.top = top + offsetSide - height;\n style.left = left + offsetX;\n style.arrowTop = height - offsetSide - arrow;\n style.arrowLeft = -arrow * 2;\n break;\n case 'center-right':\n style.top = top - height / 2;\n style.left = left + offsetX;\n style.arrowTop = height / 2 - arrow;\n style.arrowLeft = -arrow * 2;\n break;\n case 'right-bottom':\n style.top = top - offsetSide;\n style.left = left + offsetX;\n style.arrowTop = arrow;\n style.arrowLeft = -arrow * 2;\n break;\n\n // no default\n }\n }\n\n /**\n * If the tooltip contains images, recompute its size once they are loaded\n */\n private __waitImages() {\n const images = this.content.querySelectorAll('img');\n\n if (images.length > 0) {\n const promises: Array> = [];\n\n images.forEach((image) => {\n promises.push(\n new Promise((resolve) => {\n image.onload = resolve;\n image.onerror = resolve;\n })\n );\n });\n\n Promise.all(promises).then(() => {\n if (this.state.state === TooltipState.SHOWING || this.state.state === TooltipState.READY) {\n const rect = this.container.getBoundingClientRect();\n this.state.width = rect.right - rect.left;\n this.state.height = rect.bottom - rect.top;\n this.move(this.state.config);\n }\n });\n }\n }\n}\n","import { Cache as ThreeCache } from 'three';\nimport { logWarn } from '../utils';\n\nexport const Cache = {\n enabled: true,\n\n maxItems: 10,\n\n ttl: 10 * 60,\n\n items: {} as Record; lastAccess: number }>,\n\n purgeInterval: null as ReturnType,\n\n init() {\n if (ThreeCache.enabled) {\n logWarn('ThreeJS cache should be disabled');\n ThreeCache.enabled = false;\n }\n\n if (!this.purgeInterval && this.enabled) {\n this.purgeInterval = setInterval(() => this.purge(), 60 * 1000);\n }\n },\n\n add(url: string, key: string, data: HTMLImageElement | Blob) {\n if (this.enabled && key) {\n this.items[key] = this.items[key] ?? { files: {}, lastAccess: null };\n this.items[key].files[url] = data;\n this.items[key].lastAccess = Date.now();\n }\n },\n\n get(url: string, key: string): HTMLImageElement | Blob {\n if (this.enabled && key && this.items[key]) {\n this.items[key].lastAccess = Date.now();\n return this.items[key].files[url];\n }\n },\n\n remove(url: string, key: string) {\n if (this.enabled && key && this.items[key]) {\n delete this.items[key].files[url];\n if (Object.keys(this.items[key].files).length === 0) {\n delete this.items[key];\n }\n }\n },\n\n purge() {\n Object.entries(this.items)\n .sort(([, a], [, b]) => {\n return b.lastAccess - a.lastAccess;\n })\n .forEach(([key, { lastAccess }], index) => {\n // remove expired items and extra numerous items\n // but always keep the most recent one\n if (index > 0 && (Date.now() - lastAccess >= this.ttl * 1000 || index >= this.maxItems)) {\n delete this.items[key];\n }\n });\n },\n};\n","import { Euler, MathUtils, Vector3 } from 'three';\nimport { ANIMATION_MIN_DURATION, SPHERE_RADIUS, VIEWER_DATA } from '../data/constants';\nimport {\n ExtendedPosition,\n PanoData,\n PanoramaPosition,\n Point,\n Position,\n SphereCorrection,\n SphericalPosition,\n} from '../model';\nimport { PSVError } from '../PSVError';\nimport {\n AnimationOptions,\n applyEulerInverse,\n getAngle,\n getShortestArc,\n isExtendedPosition,\n isNil,\n parseAngle,\n speedToDuration,\n} from '../utils';\nimport type { Viewer } from '../Viewer';\nimport { AbstractService } from './AbstractService';\n\nconst vector3 = new Vector3();\nconst EULER_ZERO = new Euler(0, 0, 0, 'ZXY');\n\n/**\n * Collections of data converters for the viewer\n */\nexport class DataHelper extends AbstractService {\n /**\n * @internal\n */\n constructor(viewer: Viewer) {\n super(viewer);\n }\n\n /**\n * Converts vertical FOV to zoom level\n */\n fovToZoomLevel(fov: number): number {\n const temp = Math.round(((fov - this.config.minFov) / (this.config.maxFov - this.config.minFov)) * 100);\n return temp - 2 * (temp - 50);\n }\n\n /**\n * Converts zoom level to vertical FOV\n */\n zoomLevelToFov(level: number): number {\n return this.config.maxFov + (level / 100) * (this.config.minFov - this.config.maxFov);\n }\n\n /**\n * Converts vertical FOV to horizontal FOV\n */\n vFovToHFov(vFov: number): number {\n return MathUtils.radToDeg(2 * Math.atan(Math.tan(MathUtils.degToRad(vFov) / 2) * this.state.aspect));\n }\n\n /**\n * @internal\n */\n getAnimationProperties(\n speed: number | string,\n targetPosition: Position,\n targetZoom: number\n ): {\n duration: number;\n properties: AnimationOptions<{ yaw: any; pitch: any; zoom: any }>['properties'];\n } {\n const positionProvided = !isNil(targetPosition);\n const zoomProvided = !isNil(targetZoom);\n\n const properties: AnimationOptions<{ yaw: any; pitch: any; zoom: any }>['properties'] = {};\n let duration;\n\n // clean/filter position and compute duration\n if (positionProvided) {\n const currentPosition = this.viewer.getPosition();\n const dYaw = getShortestArc(currentPosition.yaw, targetPosition.yaw);\n\n properties.yaw = { start: currentPosition.yaw, end: currentPosition.yaw + dYaw };\n properties.pitch = { start: currentPosition.pitch, end: targetPosition.pitch };\n\n duration = speedToDuration(speed, getAngle(currentPosition, targetPosition));\n }\n\n // clean/filter zoom and compute duration\n if (zoomProvided) {\n const currentZoom = this.viewer.getZoomLevel();\n const dZoom = Math.abs(targetZoom - currentZoom);\n\n properties.zoom = { start: currentZoom, end: targetZoom };\n\n if (!duration) {\n // if animating zoom only and a speed is given, use an arbitrary PI/4 to compute the duration\n duration = speedToDuration(speed, ((Math.PI / 4) * dZoom) / 100);\n }\n }\n\n duration = Math.max(ANIMATION_MIN_DURATION, duration);\n\n return { duration, properties };\n }\n\n /**\n * Converts pixel texture coordinates to spherical radians coordinates\n * @throws {@link PSVError} when the current adapter does not support texture coordinates\n */\n textureCoordsToSphericalCoords(point: PanoramaPosition): Position {\n const panoData = this.state.panoData;\n if (!panoData) {\n throw new PSVError('Current adapter does not support texture coordinates.');\n }\n\n const relativeX = ((point.textureX + panoData.croppedX) / panoData.fullWidth) * Math.PI * 2;\n const relativeY = ((point.textureY + panoData.croppedY) / panoData.fullHeight) * Math.PI;\n\n const result: Position = {\n yaw: relativeX >= Math.PI ? relativeX - Math.PI : relativeX + Math.PI,\n pitch: Math.PI / 2 - relativeY,\n };\n\n // Apply panoData pose and sphereCorrection\n if (\n !EULER_ZERO.equals(this.viewer.renderer.panoramaPose) \n || !EULER_ZERO.equals(this.viewer.renderer.sphereCorrection)\n ) {\n this.sphericalCoordsToVector3(result, vector3);\n vector3.applyEuler(this.viewer.renderer.panoramaPose);\n vector3.applyEuler(this.viewer.renderer.sphereCorrection);\n return this.vector3ToSphericalCoords(vector3);\n } else {\n return result;\n }\n }\n\n /**\n * Converts spherical radians coordinates to pixel texture coordinates\n * @throws {@link PSVError} when the current adapter does not support texture coordinates\n */\n sphericalCoordsToTextureCoords(position: Position): PanoramaPosition {\n const panoData = this.state.panoData;\n if (!panoData) {\n throw new PSVError('Current adapter does not support texture coordinates.');\n }\n\n // Apply panoData pose and sphereCorrection\n if (\n !EULER_ZERO.equals(this.viewer.renderer.panoramaPose) \n || !EULER_ZERO.equals(this.viewer.renderer.sphereCorrection)\n ) {\n this.sphericalCoordsToVector3(position, vector3);\n applyEulerInverse(vector3, this.viewer.renderer.sphereCorrection);\n applyEulerInverse(vector3, this.viewer.renderer.panoramaPose);\n position = this.vector3ToSphericalCoords(vector3);\n }\n\n const relativeLong = (position.yaw / Math.PI / 2) * panoData.fullWidth;\n const relativeLat = (position.pitch / Math.PI) * panoData.fullHeight;\n\n return {\n textureX:\n Math.round(\n position.yaw < Math.PI\n ? relativeLong + panoData.fullWidth / 2\n : relativeLong - panoData.fullWidth / 2\n ) - panoData.croppedX,\n textureY: Math.round(panoData.fullHeight / 2 - relativeLat) - panoData.croppedY,\n };\n }\n\n /**\n * Converts spherical radians coordinates to a Vector3\n */\n sphericalCoordsToVector3(position: Position, vector?: Vector3, distance = SPHERE_RADIUS): Vector3 {\n if (!vector) {\n vector = new Vector3();\n }\n vector.x = distance * -Math.cos(position.pitch) * Math.sin(position.yaw);\n vector.y = distance * Math.sin(position.pitch);\n vector.z = distance * Math.cos(position.pitch) * Math.cos(position.yaw);\n return vector;\n }\n\n /**\n * Converts a Vector3 to spherical radians coordinates\n */\n vector3ToSphericalCoords(vector: Vector3): Position {\n const phi = Math.acos(vector.y / Math.sqrt(vector.x * vector.x + vector.y * vector.y + vector.z * vector.z));\n const theta = Math.atan2(vector.x, vector.z);\n\n return {\n yaw: theta < 0 ? -theta : Math.PI * 2 - theta,\n pitch: Math.PI / 2 - phi,\n };\n }\n\n /**\n * Converts position on the viewer to a THREE.Vector3\n */\n viewerCoordsToVector3(viewerPoint: Point): Vector3 {\n const sphereIntersect = this.viewer.renderer\n .getIntersections(viewerPoint)\n .filter((i) => i.object.userData[VIEWER_DATA]);\n\n if (sphereIntersect.length) {\n return sphereIntersect[0].point;\n } else {\n return null;\n }\n }\n\n /**\n * Converts position on the viewer to spherical radians coordinates\n */\n viewerCoordsToSphericalCoords(viewerPoint: Point): Position {\n const vector = this.viewerCoordsToVector3(viewerPoint);\n return vector ? this.vector3ToSphericalCoords(vector) : null;\n }\n\n /**\n * Converts a Vector3 to position on the viewer\n */\n vector3ToViewerCoords(vector: Vector3): Point {\n const vectorClone = vector.clone();\n vectorClone.project(this.viewer.renderer.camera);\n\n return {\n x: Math.round(((vectorClone.x + 1) / 2) * this.state.size.width),\n y: Math.round(((1 - vectorClone.y) / 2) * this.state.size.height),\n };\n }\n\n /**\n * Converts spherical radians coordinates to position on the viewer\n */\n sphericalCoordsToViewerCoords(position: Position): Point {\n this.sphericalCoordsToVector3(position, vector3);\n return this.vector3ToViewerCoords(vector3);\n }\n\n /**\n * Checks if a point in the 3D scene is currently visible\n */\n isPointVisible(vector: Vector3): boolean;\n\n /**\n * Checks if a point on the sphere is currently visible\n */\n isPointVisible(position: Position): boolean;\n\n /**\n * @internal\n */\n isPointVisible(point: Vector3 | Position): boolean {\n let vector: Vector3;\n let viewerPoint: Point;\n\n if (point instanceof Vector3) {\n vector = point;\n viewerPoint = this.vector3ToViewerCoords(point);\n } else if (isExtendedPosition(point)) {\n vector = this.sphericalCoordsToVector3(point, vector3);\n viewerPoint = this.vector3ToViewerCoords(vector);\n } else {\n return false;\n }\n\n return (\n vector.dot(this.viewer.state.direction) > 0\n && viewerPoint.x >= 0\n && viewerPoint.x <= this.viewer.state.size.width\n && viewerPoint.y >= 0\n && viewerPoint.y <= this.viewer.state.size.height\n );\n }\n\n /**\n * Converts pixel position to angles if present and ensure boundaries\n */\n cleanPosition(position: ExtendedPosition): Position {\n if (\n (position as PanoramaPosition).textureX !== undefined \n && (position as PanoramaPosition).textureY !== undefined\n ) {\n return this.textureCoordsToSphericalCoords(position as PanoramaPosition);\n }\n return {\n yaw: parseAngle((position as SphericalPosition).yaw),\n pitch: parseAngle((position as SphericalPosition).pitch, !this.state.littlePlanet),\n };\n }\n\n /**\n * Ensure a SphereCorrection object is valid\n */\n cleanSphereCorrection(sphereCorrection: SphereCorrection): SphereCorrection {\n return {\n pan: parseAngle(sphereCorrection?.pan || 0),\n tilt: parseAngle(sphereCorrection?.tilt || 0, true),\n roll: parseAngle(sphereCorrection?.roll || 0, true, false),\n };\n }\n\n /**\n * Parse the pose angles of the pano data\n */\n cleanPanoramaPose(panoData: PanoData): SphereCorrection {\n return {\n pan: MathUtils.degToRad(panoData?.poseHeading || 0),\n tilt: MathUtils.degToRad(panoData?.posePitch || 0),\n roll: MathUtils.degToRad(panoData?.poseRoll || 0),\n };\n }\n}\n","import { ParsedViewerConfig } from '../model';\nimport type { Viewer } from '../Viewer';\nimport { ViewerState } from './ViewerState';\n\n/**\n * Base class for services\n */\nexport abstract class AbstractService {\n protected readonly config: ParsedViewerConfig;\n protected readonly state: ViewerState;\n\n /**\n * @internal\n */\n constructor(protected readonly viewer: Viewer) {\n this.config = viewer.config;\n this.state = viewer.state;\n }\n\n /**\n * Destroys the service\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n destroy() {}\n}\n","import { MathUtils, Mesh, SplineCurve, Vector2 } from 'three';\nimport {\n ACTIONS,\n CAPTURE_EVENTS_CLASS,\n CTRLZOOM_TIMEOUT,\n DBLCLICK_DELAY,\n IDS,\n INERTIA_WINDOW,\n KEY_CODES,\n LONGTOUCH_DELAY,\n MOVE_THRESHOLD,\n TWOFINGERSOVERLAY_DELAY,\n VIEWER_DATA,\n} from '../data/constants';\nimport { SYSTEM } from '../data/system';\nimport {\n ClickEvent,\n DoubleClickEvent,\n FullscreenEvent,\n KeypressEvent,\n ObjectEnterEvent,\n ObjectHoverEvent,\n ObjectLeaveEvent,\n ViewerEvents,\n} from '../events';\nimport gestureIcon from '../icons/gesture.svg';\nimport mousewheelIcon from '../icons/mousewheel.svg';\nimport { ClickData, Point, Position } from '../model';\nimport {\n Animation,\n clone,\n distance,\n getClosest,\n getPosition,\n getTouchData,\n hasParent,\n isEmpty,\n throttle,\n} from '../utils';\nimport { PressHandler } from '../utils/PressHandler';\nimport type { Viewer } from '../Viewer';\nimport { AbstractService } from './AbstractService';\n\nclass Step {\n static IDLE = 0;\n static CLICK = 1;\n static MOVING = 2;\n static INERTIA = 4;\n\n private $: number = Step.IDLE;\n\n is(...steps: number[]): boolean {\n return steps.some((step) => this.$ & step);\n }\n\n set(step: number) {\n this.$ = step;\n }\n\n add(step: number) {\n this.$ |= step;\n }\n\n remove(step: number) {\n this.$ &= ~step;\n }\n}\n\n/**\n * Events handler\n * @internal\n */\nexport class EventsHandler extends AbstractService {\n private readonly data = {\n /** start x position of the click/touch */\n startMouseX: 0,\n /** start y position of the click/touch */\n startMouseY: 0,\n /** current x position of the cursor */\n mouseX: 0,\n /** current y position of the cursor */\n mouseY: 0,\n /** list of latest positions of the cursor, [time, x, y] */\n mouseHistory: [] as Array<[number, number, number]>,\n /** distance between fingers when zooming */\n pinchDist: 0,\n /** when the Ctrl key is pressed */\n ctrlKeyDown: false,\n /** temporary storage of click data between two clicks */\n dblclickData: null as ClickData,\n dblclickTimeout: null as ReturnType,\n longtouchTimeout: null as ReturnType,\n twofingersTimeout: null as ReturnType,\n ctrlZoomTimeout: null as ReturnType,\n };\n\n private readonly step = new Step();\n private readonly keyHandler = new PressHandler();\n private readonly resizeObserver = new ResizeObserver(throttle(() => this.viewer.autoSize(), 50));\n private readonly moveThreshold = MOVE_THRESHOLD * SYSTEM.pixelRatio;\n\n constructor(viewer: Viewer) {\n super(viewer);\n }\n\n /**\n * @internal\n */\n init() {\n window.addEventListener('keydown', this, { passive: false });\n window.addEventListener('keyup', this);\n this.viewer.container.addEventListener('mousedown', this);\n window.addEventListener('mousemove', this, { passive: false });\n window.addEventListener('mouseup', this);\n this.viewer.container.addEventListener('touchstart', this, { passive: false });\n window.addEventListener('touchmove', this, { passive: false });\n window.addEventListener('touchend', this, { passive: false });\n this.viewer.container.addEventListener('wheel', this, { passive: false });\n document.addEventListener(SYSTEM.fullscreenEvent, this);\n this.resizeObserver.observe(this.viewer.container);\n }\n\n override destroy() {\n window.removeEventListener('keydown', this);\n window.removeEventListener('keyup', this);\n this.viewer.container.removeEventListener('mousedown', this);\n window.removeEventListener('mousemove', this);\n window.removeEventListener('mouseup', this);\n this.viewer.container.removeEventListener('touchstart', this);\n window.removeEventListener('touchmove', this);\n window.removeEventListener('touchend', this);\n this.viewer.container.removeEventListener('wheel', this);\n document.removeEventListener(SYSTEM.fullscreenEvent, this);\n this.resizeObserver.disconnect();\n\n clearTimeout(this.data.dblclickTimeout);\n clearTimeout(this.data.longtouchTimeout);\n clearTimeout(this.data.twofingersTimeout);\n clearTimeout(this.data.ctrlZoomTimeout);\n\n super.destroy();\n }\n\n /**\n * @internal\n */\n handleEvent(evt: Event) {\n // prettier-ignore\n switch (evt.type) {\n case 'keydown': this.__onKeyDown(evt as KeyboardEvent); break;\n case 'keyup': this.__onKeyUp(); break;\n case 'mousemove': this.__onMouseMove(evt as MouseEvent); break;\n case 'mouseup': this.__onMouseUp(evt as MouseEvent); break;\n case 'touchmove': this.__onTouchMove(evt as TouchEvent); break;\n case 'touchend': this.__onTouchEnd(evt as TouchEvent); break;\n case SYSTEM.fullscreenEvent: this.__onFullscreenChange(); break;\n }\n\n if (!getClosest(evt.target as HTMLElement, '.' + CAPTURE_EVENTS_CLASS)) {\n // prettier-ignore\n switch (evt.type) {\n case 'mousedown': this.__onMouseDown(evt as MouseEvent); break;\n case 'touchstart': this.__onTouchStart(evt as TouchEvent); break;\n case 'wheel': this.__onMouseWheel(evt as WheelEvent); break;\n }\n }\n }\n\n /**\n * Handles keyboard events\n */\n private __onKeyDown(e: KeyboardEvent) {\n if (this.config.mousewheelCtrlKey) {\n this.data.ctrlKeyDown = e.key === KEY_CODES.Control;\n\n if (this.data.ctrlKeyDown) {\n clearTimeout(this.data.ctrlZoomTimeout);\n this.viewer.overlay.hide(IDS.CTRL_ZOOM);\n }\n }\n\n if (!this.viewer.dispatchEvent(new KeypressEvent(e.key))) {\n return;\n }\n\n if (!this.state.keyboardEnabled) {\n return;\n }\n\n const action = this.config.keyboardActions?.[e.key];\n\n if (typeof action === 'function') {\n action(this.viewer);\n e.preventDefault();\n } else if (action && !this.keyHandler.pending) {\n if (action !== ACTIONS.ZOOM_IN && action !== ACTIONS.ZOOM_OUT) {\n this.viewer.stopAll();\n }\n\n // prettier-ignore\n switch (action) {\n case ACTIONS.ROTATE_UP: this.viewer.dynamics.position.roll({ pitch: false }); break;\n case ACTIONS.ROTATE_DOWN: this.viewer.dynamics.position.roll({ pitch: true }); break;\n case ACTIONS.ROTATE_RIGHT: this.viewer.dynamics.position.roll({ yaw: false }); break;\n case ACTIONS.ROTATE_LEFT: this.viewer.dynamics.position.roll({ yaw: true }); break;\n case ACTIONS.ZOOM_IN: this.viewer.dynamics.zoom.roll(false); break;\n case ACTIONS.ZOOM_OUT: this.viewer.dynamics.zoom.roll(true); break;\n }\n\n this.keyHandler.down();\n e.preventDefault();\n }\n }\n\n /**\n * Handles keyboard events\n */\n private __onKeyUp() {\n this.data.ctrlKeyDown = false;\n\n if (!this.state.keyboardEnabled) {\n return;\n }\n\n this.keyHandler.up(() => {\n this.viewer.dynamics.position.stop();\n this.viewer.dynamics.zoom.stop();\n this.viewer.resetIdleTimer();\n });\n }\n\n /**\n * Handles mouse down events\n */\n private __onMouseDown(evt: MouseEvent) {\n this.step.add(Step.CLICK);\n this.data.startMouseX = evt.clientX;\n this.data.startMouseY = evt.clientY;\n }\n\n /**\n *Handles mouse up events\n */\n private __onMouseUp(evt: MouseEvent) {\n if (this.step.is(Step.CLICK, Step.MOVING)) {\n this.__stopMove(evt.clientX, evt.clientY, evt.target, evt.button === 2);\n }\n }\n\n /**\n * Handles mouse move events\n */\n private __onMouseMove(evt: MouseEvent) {\n if (this.config.mousemove && this.step.is(Step.CLICK, Step.MOVING)) {\n evt.preventDefault();\n this.__doMove(evt.clientX, evt.clientY);\n }\n\n this.__handleObjectsEvents(evt);\n }\n\n /**\n * Handles touch events\n */\n private __onTouchStart(evt: TouchEvent) {\n if (evt.touches.length === 1) {\n this.step.add(Step.CLICK);\n this.data.startMouseX = evt.touches[0].clientX;\n this.data.startMouseY = evt.touches[0].clientY;\n\n if (!this.data.longtouchTimeout) {\n this.data.longtouchTimeout = setTimeout(() => {\n const touch = evt.touches[0];\n this.__stopMove(touch.clientX, touch.clientY, touch.target, true);\n this.data.longtouchTimeout = null;\n }, LONGTOUCH_DELAY);\n }\n } else if (evt.touches.length === 2) {\n this.step.set(Step.IDLE);\n this.__cancelLongTouch();\n\n if (this.config.mousemove) {\n this.__cancelTwoFingersOverlay();\n this.__startMoveZoom(evt);\n evt.preventDefault();\n }\n }\n }\n\n /**\n * Handles touch events\n */\n private __onTouchEnd(evt: TouchEvent) {\n this.__cancelLongTouch();\n\n if (this.step.is(Step.CLICK, Step.MOVING)) {\n evt.preventDefault();\n this.__cancelTwoFingersOverlay();\n\n if (evt.touches.length === 1) {\n this.__stopMove(this.data.mouseX, this.data.mouseY);\n } else if (evt.touches.length === 0) {\n const touch = evt.changedTouches[0];\n this.__stopMove(touch.clientX, touch.clientY, touch.target);\n }\n }\n }\n\n /**\n * Handles touch move events\n */\n private __onTouchMove(evt: TouchEvent) {\n this.__cancelLongTouch();\n\n if (!this.config.mousemove) {\n return;\n }\n\n if (evt.touches.length === 1) {\n if (this.config.touchmoveTwoFingers) {\n if (this.step.is(Step.CLICK) && !this.data.twofingersTimeout) {\n this.data.twofingersTimeout = setTimeout(() => {\n this.viewer.overlay.show({\n id: IDS.TWO_FINGERS,\n image: gestureIcon,\n title: this.config.lang.twoFingers,\n });\n }, TWOFINGERSOVERLAY_DELAY);\n }\n } else if (this.step.is(Step.CLICK, Step.MOVING)) {\n evt.preventDefault();\n const touch = evt.touches[0];\n this.__doMove(touch.clientX, touch.clientY);\n }\n } else {\n this.__doMoveZoom(evt);\n this.__cancelTwoFingersOverlay();\n }\n }\n\n /**\n * Cancel the long touch timer if any\n */\n private __cancelLongTouch() {\n if (this.data.longtouchTimeout) {\n clearTimeout(this.data.longtouchTimeout);\n this.data.longtouchTimeout = null;\n }\n }\n\n /**\n * Cancel the two fingers overlay timer if any\n */\n private __cancelTwoFingersOverlay() {\n if (this.config.touchmoveTwoFingers) {\n if (this.data.twofingersTimeout) {\n clearTimeout(this.data.twofingersTimeout);\n this.data.twofingersTimeout = null;\n }\n this.viewer.overlay.hide(IDS.TWO_FINGERS);\n }\n }\n\n /**\n * Handles mouse wheel events\n */\n private __onMouseWheel(evt: WheelEvent) {\n if (!this.config.mousewheel || !evt.deltaY) {\n return;\n }\n\n if (this.config.mousewheelCtrlKey && !this.data.ctrlKeyDown) {\n this.viewer.overlay.show({\n id: IDS.CTRL_ZOOM,\n image: mousewheelIcon,\n title: this.config.lang.ctrlZoom,\n });\n\n clearTimeout(this.data.ctrlZoomTimeout);\n this.data.ctrlZoomTimeout = setTimeout(() => this.viewer.overlay.hide(IDS.CTRL_ZOOM), CTRLZOOM_TIMEOUT);\n\n return;\n }\n\n evt.preventDefault();\n evt.stopPropagation();\n\n const delta = (evt.deltaY / Math.abs(evt.deltaY)) * 5 * this.config.zoomSpeed;\n if (delta !== 0) {\n this.viewer.dynamics.zoom.step(-delta, 5);\n }\n }\n\n /**\n * Handles fullscreen events\n */\n private __onFullscreenChange() {\n const fullscreen = this.viewer.isFullscreenEnabled();\n\n if (this.config.keyboard === 'fullscreen') {\n if (fullscreen) {\n this.viewer.startKeyboardControl();\n } else {\n this.viewer.stopKeyboardControl();\n }\n }\n\n this.viewer.dispatchEvent(new FullscreenEvent(fullscreen));\n }\n\n /**\n * Resets all state variables\n */\n private __resetMove() {\n this.step.set(Step.IDLE);\n this.data.mouseX = 0;\n this.data.mouseY = 0;\n this.data.startMouseX = 0;\n this.data.startMouseY = 0;\n this.data.mouseHistory.length = 0;\n }\n\n /**\n * Initializes the combines move and zoom\n */\n private __startMoveZoom(evt: TouchEvent) {\n this.viewer.stopAll(); // TODO nom ?\n this.__resetMove();\n\n const touchData = getTouchData(evt);\n\n this.step.set(Step.MOVING);\n ({\n distance: this.data.pinchDist,\n center: { x: this.data.mouseX, y: this.data.mouseY },\n } = touchData);\n\n this.__logMouseMove(this.data.mouseX, this.data.mouseY);\n }\n\n /**\n * Stops the movement\n * @description If the move threshold was not reached a click event is triggered, otherwise an animation is launched to simulate inertia\n */\n private __stopMove(clientX: number, clientY: number, target?: EventTarget, rightclick = false) {\n if (this.step.is(Step.MOVING)) {\n if (this.config.moveInertia) {\n this.__logMouseMove(clientX, clientY);\n this.__stopMoveInertia(clientX, clientY);\n } else {\n this.__resetMove();\n this.viewer.resetIdleTimer();\n }\n } else {\n if (this.step.is(Step.CLICK) && !this.__moveThresholdReached(clientX, clientY)) {\n this.__doClick(clientX, clientY, target, rightclick);\n }\n this.step.remove(Step.CLICK);\n if (!this.step.is(Step.INERTIA)) {\n this.__resetMove();\n this.viewer.resetIdleTimer();\n }\n }\n }\n\n /**\n * Performs an animation to simulate inertia when the movement stops\n */\n private __stopMoveInertia(clientX: number, clientY: number) {\n // get direction at end of movement\n const curve = new SplineCurve(this.data.mouseHistory.map(([, x, y]) => new Vector2(x, y)));\n const direction = curve.getTangent(1);\n\n // average speed\n // prettier-ignore\n const speed = this.data.mouseHistory.reduce(({ total, prev }, curr) => ({\n total: !prev ? 0 : total + distance({ x: prev[1], y: prev[2] }, { x: curr[1], y: curr[2] }) / (curr[0] - prev[0]),\n prev: curr,\n }), {\n total: 0,\n prev: null,\n }).total / this.data.mouseHistory.length;\n\n if (!speed) {\n this.__resetMove();\n this.viewer.resetIdleTimer();\n return;\n }\n\n this.step.set(Step.INERTIA);\n\n let currentClientX = clientX;\n let currentClientY = clientY;\n\n this.state.animation = new Animation({\n properties: {\n speed: { start: speed, end: 0 },\n },\n duration: 1000,\n easing: 'outQuad',\n onTick: (properties) => {\n // 3 is a magic number\n currentClientX += properties.speed * direction.x * 3 * SYSTEM.pixelRatio;\n currentClientY += properties.speed * direction.y * 3 * SYSTEM.pixelRatio;\n this.__applyMove(currentClientX, currentClientY);\n },\n });\n\n this.state.animation.then((done) => {\n this.state.animation = null;\n if (done) {\n this.__resetMove();\n this.viewer.resetIdleTimer();\n }\n });\n }\n\n /**\n * Triggers an event with all coordinates when a simple click is performed\n */\n private __doClick(clientX: number, clientY: number, target: EventTarget, rightclick = false) {\n const boundingRect = this.viewer.container.getBoundingClientRect();\n\n const viewerX = clientX - boundingRect.left;\n const viewerY = clientY - boundingRect.top;\n\n const intersections = this.viewer.renderer.getIntersections({ x: viewerX, y: viewerY });\n const sphereIntersection = intersections.find((i) => i.object.userData[VIEWER_DATA]);\n\n if (sphereIntersection) {\n const sphericalCoords = this.viewer.dataHelper.vector3ToSphericalCoords(sphereIntersection.point);\n\n const data: ClickData = {\n rightclick: rightclick,\n target: target as HTMLElement,\n clientX,\n clientY,\n viewerX,\n viewerY,\n yaw: sphericalCoords.yaw,\n pitch: sphericalCoords.pitch,\n objects: intersections.map((i) => i.object).filter((o) => !o.userData[VIEWER_DATA]),\n };\n\n try {\n const textureCoords = this.viewer.dataHelper.sphericalCoordsToTextureCoords(data);\n data.textureX = textureCoords.textureX;\n data.textureY = textureCoords.textureY;\n } catch (e) {\n data.textureX = NaN;\n data.textureY = NaN;\n }\n\n if (!this.data.dblclickTimeout) {\n this.viewer.dispatchEvent(new ClickEvent(data));\n\n this.data.dblclickData = clone(data);\n this.data.dblclickTimeout = setTimeout(() => {\n this.data.dblclickTimeout = null;\n this.data.dblclickData = null;\n }, DBLCLICK_DELAY);\n } else {\n if (\n Math.abs(this.data.dblclickData.clientX - data.clientX) < this.moveThreshold\n && Math.abs(this.data.dblclickData.clientY - data.clientY) < this.moveThreshold\n ) {\n this.viewer.dispatchEvent(new DoubleClickEvent(this.data.dblclickData));\n }\n\n clearTimeout(this.data.dblclickTimeout);\n this.data.dblclickTimeout = null;\n this.data.dblclickData = null;\n }\n }\n }\n\n /**\n * Trigger events for observed THREE objects\n */\n private __handleObjectsEvents(evt: MouseEvent) {\n if (!isEmpty(this.state.objectsObservers) && hasParent(evt.target as HTMLElement, this.viewer.container)) {\n const viewerPos = getPosition(this.viewer.container);\n\n const viewerPoint: Point = {\n x: evt.clientX - viewerPos.x,\n y: evt.clientY - viewerPos.y,\n };\n\n const intersections = this.viewer.renderer.getIntersections(viewerPoint);\n\n const emit = (\n object: Mesh,\n key: string,\n evtCtor: new (e: MouseEvent, o: Mesh, pt: Point, data: any) => ViewerEvents\n ) => {\n this.viewer.dispatchEvent(new evtCtor(evt, object, viewerPoint, key));\n };\n\n for (const [key, object] of Object.entries(this.state.objectsObservers) as Array<[string, Mesh | null]>) {\n const intersection = intersections.find((i) => i.object.userData[key]);\n\n if (intersection) {\n if (object && intersection.object !== object) {\n emit(object, key, ObjectLeaveEvent);\n this.state.objectsObservers[key] = null;\n }\n\n if (!object) {\n this.state.objectsObservers[key] = intersection.object;\n emit(intersection.object, key, ObjectEnterEvent);\n } else {\n emit(intersection.object, key, ObjectHoverEvent);\n }\n } else if (object) {\n emit(object, key, ObjectLeaveEvent);\n this.state.objectsObservers[key] = null;\n }\n }\n }\n }\n\n /**\n * Starts moving when crossing moveThreshold and performs movement\n */\n private __doMove(clientX: number, clientY: number) {\n if (this.step.is(Step.CLICK) && this.__moveThresholdReached(clientX, clientY)) {\n this.viewer.stopAll();\n this.__resetMove();\n this.step.set(Step.MOVING);\n this.data.mouseX = clientX;\n this.data.mouseY = clientY;\n this.__logMouseMove(clientX, clientY);\n } else if (this.step.is(Step.MOVING)) {\n this.__applyMove(clientX, clientY);\n this.__logMouseMove(clientX, clientY);\n }\n }\n\n /**\n * Checks if the cursor was move beyond the move threshold\n */\n private __moveThresholdReached(clientX: number, clientY: number) {\n return (\n Math.abs(clientX - this.data.startMouseX) >= this.moveThreshold\n || Math.abs(clientY - this.data.startMouseY) >= this.moveThreshold\n );\n }\n\n /**\n * Raw method for movement, called from mouse event and move inertia\n */\n private __applyMove(clientX: number, clientY: number) {\n const rotation: Position = {\n yaw:\n this.config.moveSpeed\n * ((clientX - this.data.mouseX) / this.state.size.width)\n * MathUtils.degToRad(this.state.littlePlanet ? 90 : this.state.hFov),\n pitch:\n this.config.moveSpeed\n * ((clientY - this.data.mouseY) / this.state.size.height)\n * MathUtils.degToRad(this.state.littlePlanet ? 90 : this.state.vFov),\n };\n\n const currentPosition = this.viewer.getPosition();\n this.viewer.rotate({\n yaw: currentPosition.yaw - rotation.yaw,\n pitch: currentPosition.pitch + rotation.pitch,\n });\n\n this.data.mouseX = clientX;\n this.data.mouseY = clientY;\n }\n\n /**\n * Perfoms combined move and zoom\n */\n private __doMoveZoom(evt: TouchEvent) {\n if (this.step.is(Step.MOVING)) {\n evt.preventDefault();\n\n const touchData = getTouchData(evt);\n const delta = ((touchData.distance - this.data.pinchDist) / SYSTEM.pixelRatio) * this.config.zoomSpeed;\n\n this.viewer.zoom(this.viewer.getZoomLevel() + delta);\n this.__doMove(touchData.center.x, touchData.center.y);\n\n this.data.pinchDist = touchData.distance;\n }\n }\n\n /**\n * Stores each mouse position during a mouse move\n * @description Positions older than \"INERTIA_WINDOW\" are removed
\n * Positions before a pause of \"INERTIA_WINDOW\" / 10 are removed\n */\n private __logMouseMove(clientX: number, clientY: number) {\n const now = Date.now();\n\n const last = this.data.mouseHistory.length\n ? this.data.mouseHistory[this.data.mouseHistory.length - 1]\n : [0, -1, -1];\n\n // avoid duplicates\n if (last[1] === clientX && last[2] === clientY) {\n last[0] = now;\n } else if (now === last[0]) {\n last[1] = clientX;\n last[2] = clientY;\n } else {\n this.data.mouseHistory.push([now, clientX, clientY]);\n }\n\n let previous = null;\n\n for (let i = 0; i < this.data.mouseHistory.length; ) {\n if (this.data.mouseHistory[i][0] < now - INERTIA_WINDOW) {\n this.data.mouseHistory.splice(i, 1);\n } else if (previous && this.data.mouseHistory[i][0] - previous > INERTIA_WINDOW / 10) {\n this.data.mouseHistory.splice(0, i);\n i = 0;\n previous = this.data.mouseHistory[i][0];\n } else {\n previous = this.data.mouseHistory[i][0];\n i++;\n }\n }\n }\n}\n","import {\n Euler,\n Group,\n Intersection,\n Mesh,\n Object3D,\n PerspectiveCamera,\n Raycaster,\n Renderer as ThreeRenderer,\n Scene,\n Vector2,\n WebGLRenderer,\n WebGLRenderTarget,\n LinearSRGBColorSpace,\n Vector3,\n} from 'three';\nimport { SPHERE_RADIUS, VIEWER_DATA } from '../data/constants';\nimport { SYSTEM } from '../data/system';\nimport {\n BeforeAnimateEvent,\n BeforeRenderEvent,\n ConfigChangedEvent,\n PositionUpdatedEvent,\n RenderEvent,\n SizeUpdatedEvent,\n ZoomUpdatedEvent,\n} from '../events';\nimport { PanoData, PanoramaOptions, Point, SphereCorrection, TextureData } from '../model';\nimport { Animation, isNil } from '../utils';\nimport type { Viewer } from '../Viewer';\nimport { AbstractService } from './AbstractService';\nimport type { AbstractAdapter } from '../adapters/AbstractAdapter';\n\nconst vector2 = new Vector2();\n\nexport type CustomRenderer = Pick & {\n getIntersections?(raycaster: Raycaster, vector: Vector2): Array>;\n};\n\n/**\n * Controller for the three.js scene\n */\nexport class Renderer extends AbstractService {\n private readonly renderer: WebGLRenderer;\n private readonly scene: Scene;\n /** @internal */\n public readonly camera: PerspectiveCamera;\n private readonly mesh: Mesh;\n private readonly meshContainer: Group;\n private readonly raycaster: Raycaster;\n private readonly container: HTMLElement;\n\n private timestamp?: number;\n private customRenderer?: CustomRenderer;\n\n get panoramaPose(): Euler {\n return this.mesh.rotation;\n }\n\n get sphereCorrection(): Euler {\n return this.meshContainer.rotation;\n }\n\n /**\n * @internal\n */\n constructor(viewer: Viewer) {\n super(viewer);\n\n this.renderer = new WebGLRenderer(this.config.rendererParameters);\n this.renderer.setPixelRatio(SYSTEM.pixelRatio);\n // https://discourse.threejs.org/t/updates-to-color-management-in-three-js-r152/50791\n this.renderer.outputColorSpace = LinearSRGBColorSpace;\n this.renderer.domElement.className = 'psv-canvas';\n\n this.scene = new Scene();\n\n this.camera = new PerspectiveCamera(50, 16 / 9, 0.1, 2 * SPHERE_RADIUS);\n this.camera.matrixWorldAutoUpdate = false;\n\n this.mesh = this.viewer.adapter.createMesh();\n this.mesh.userData = { [VIEWER_DATA]: true };\n\n this.meshContainer = new Group();\n this.meshContainer.add(this.mesh);\n this.scene.add(this.meshContainer);\n\n this.raycaster = new Raycaster();\n\n this.container = document.createElement('div');\n this.container.className = 'psv-canvas-container';\n this.container.appendChild(this.renderer.domElement);\n this.viewer.container.appendChild(this.container);\n\n this.viewer.addEventListener(SizeUpdatedEvent.type, this);\n this.viewer.addEventListener(ZoomUpdatedEvent.type, this);\n this.viewer.addEventListener(PositionUpdatedEvent.type, this);\n this.viewer.addEventListener(ConfigChangedEvent.type, this);\n\n this.hide();\n }\n\n /**\n * @internal\n */\n init() {\n this.show();\n this.renderer.setAnimationLoop((t) => this.__renderLoop(t));\n }\n\n /**\n * @internal\n */\n override destroy() {\n // cancel render loop\n this.renderer.setAnimationLoop(null);\n\n // destroy ThreeJS view\n this.cleanScene(this.scene);\n\n // remove container\n this.viewer.container.removeChild(this.container);\n\n this.viewer.removeEventListener(SizeUpdatedEvent.type, this);\n this.viewer.removeEventListener(ZoomUpdatedEvent.type, this);\n this.viewer.removeEventListener(PositionUpdatedEvent.type, this);\n this.viewer.removeEventListener(ConfigChangedEvent.type, this);\n\n super.destroy();\n }\n\n /**\n * @internal\n */\n handleEvent(e: Event) {\n // prettier-ignore\n switch (e.type) {\n case SizeUpdatedEvent.type: this.__onSizeUpdated(); break;\n case ZoomUpdatedEvent.type: this.__onZoomUpdated(); break;\n case PositionUpdatedEvent.type: this.__onPositionUpdated(); break;\n case ConfigChangedEvent.type:\n if ((e as ConfigChangedEvent).containsOptions('fisheye')) {\n this.__onPositionUpdated();\n }\n if ((e as ConfigChangedEvent).containsOptions('canvasBackground')) {\n this.container.style.background = this.config.canvasBackground;\n }\n break;\n }\n }\n\n /**\n * Hides the viewer\n */\n hide() {\n this.container.style.opacity = '0';\n }\n\n /**\n * Shows the viewer\n */\n show() {\n this.container.style.opacity = '1';\n }\n\n /**\n * Resets or replaces the THREE renderer by a custom one\n */\n setCustomRenderer(factory: (renderer: WebGLRenderer) => CustomRenderer) {\n if (factory) {\n this.customRenderer = factory(this.renderer);\n } else {\n this.customRenderer = null;\n }\n this.viewer.needsUpdate();\n }\n\n /**\n * Updates the size of the renderer and the aspect of the camera\n */\n private __onSizeUpdated() {\n this.renderer.setSize(this.state.size.width, this.state.size.height);\n this.camera.aspect = this.state.aspect;\n this.camera.updateProjectionMatrix();\n this.viewer.needsUpdate();\n }\n\n /**\n * Updates the fov of the camera\n */\n private __onZoomUpdated() {\n this.camera.fov = this.state.vFov;\n this.camera.updateProjectionMatrix();\n this.viewer.needsUpdate();\n }\n\n /**\n * Updates the position of the camera\n */\n private __onPositionUpdated() {\n this.camera.position.set(0, 0, 0);\n this.camera.lookAt(this.state.direction);\n if (this.config.fisheye) {\n this.camera.position\n .copy(this.state.direction)\n .multiplyScalar(this.config.fisheye / 2)\n .negate();\n }\n this.camera.updateMatrixWorld();\n this.viewer.needsUpdate();\n }\n\n /**\n * Main event loop, performs a render if `state.needsUpdate` is true\n */\n private __renderLoop(timestamp: number) {\n const elapsed = !this.timestamp ? 0 : timestamp - this.timestamp;\n this.timestamp = timestamp;\n\n this.viewer.dispatchEvent(new BeforeRenderEvent(timestamp, elapsed));\n this.viewer.dynamics.update(elapsed);\n\n if (this.state.needsUpdate || this.state.continuousUpdateCount > 0) {\n (this.customRenderer || this.renderer).render(this.scene, this.camera);\n this.viewer.dispatchEvent(new RenderEvent());\n this.state.needsUpdate = false;\n }\n }\n\n /**\n * Applies the texture to the scene, creates the scene if needed\n * @internal\n */\n setTexture(textureData: TextureData) {\n if ((this.viewer.adapter.constructor as typeof AbstractAdapter).supportsOverlay) {\n this.setOverlay(null, 0);\n }\n\n if (this.state.textureData) {\n this.viewer.adapter.disposeTexture(this.state.textureData);\n }\n\n this.state.textureData = textureData;\n this.state.panoData = textureData.panoData;\n\n this.viewer.adapter.setTexture(this.mesh, textureData);\n\n this.viewer.needsUpdate();\n }\n\n /**\n * Applies the overlay to the mesh\n * @internal\n */\n setOverlay(textureData: TextureData, opacity: number) {\n if (this.state.overlayData) {\n this.viewer.adapter.disposeTexture(this.state.overlayData);\n }\n\n this.state.overlayData = textureData;\n\n this.viewer.adapter.setOverlay(this.mesh, textureData, opacity);\n\n this.viewer.needsUpdate();\n }\n\n /**\n * Applies a panorama data pose to a Mesh\n * @internal\n */\n setPanoramaPose(panoData: PanoData, mesh: Mesh = this.mesh) {\n // By Google documentation the angles are applied on the camera in order : heading, pitch, roll\n // here we apply the reverse transformation on the sphere\n const cleanCorrection = this.viewer.dataHelper.cleanPanoramaPose(panoData);\n\n mesh.rotation.set(-cleanCorrection.tilt, -cleanCorrection.pan, -cleanCorrection.roll, 'ZXY');\n }\n\n /**\n * Applies a SphereCorrection to a Group\n * @internal\n */\n setSphereCorrection(sphereCorrection: SphereCorrection, group: Object3D = this.meshContainer) {\n const cleanCorrection = this.viewer.dataHelper.cleanSphereCorrection(sphereCorrection);\n\n group.rotation.set(cleanCorrection.tilt, cleanCorrection.pan, cleanCorrection.roll, 'ZXY');\n }\n\n /**\n * Performs transition between the current and a new texture\n * @internal\n */\n transition(textureData: TextureData, options: PanoramaOptions): Animation {\n const positionProvided = !isNil(options.position);\n const zoomProvided = !isNil(options.zoom);\n\n const e = new BeforeAnimateEvent(\n positionProvided ? this.viewer.dataHelper.cleanPosition(options.position) : undefined,\n options.zoom\n );\n this.viewer.dispatchEvent(e);\n\n // create temp group and new mesh, half size to be in \"front\" of the first one\n const group = new Group();\n const mesh = this.viewer.adapter.createMesh(0.5);\n this.viewer.adapter.setTexture(mesh, textureData, true);\n this.viewer.adapter.setTextureOpacity(mesh, 0);\n this.setPanoramaPose(textureData.panoData, mesh);\n this.setSphereCorrection(options.sphereCorrection, group);\n\n // rotate the new sphere to make the target position face the camera\n if (positionProvided && options.transition === 'fade-only') {\n const currentPosition = this.viewer.getPosition();\n\n // rotation along the vertical axis\n const verticalAxis = new Vector3(0, 1, 0);\n group.rotateOnWorldAxis(verticalAxis, e.position.yaw - currentPosition.yaw);\n\n // rotation along the camera horizontal axis\n const horizontalAxis = new Vector3(0, 1, 0).cross(this.camera.getWorldDirection(new Vector3())).normalize();\n group.rotateOnWorldAxis(horizontalAxis, e.position.pitch - currentPosition.pitch);\n }\n\n group.add(mesh);\n this.scene.add(group);\n\n // make sure the new texture is transfered to the GPU before starting the animation\n this.renderer.setRenderTarget(new WebGLRenderTarget());\n this.renderer.render(this.scene, this.camera);\n this.renderer.setRenderTarget(null);\n\n const { duration, properties } = this.viewer.dataHelper.getAnimationProperties(\n options.transition as any,\n options.transition === true ? e.position : null,\n e.zoomLevel\n );\n\n const animation = new Animation({\n properties: {\n ...properties,\n opacity: { start: 0.0, end: 1.0 },\n },\n duration: duration,\n easing: 'inOutCubic',\n onTick: (props) => {\n this.viewer.adapter.setTextureOpacity(mesh, props.opacity);\n\n if (positionProvided && options.transition === true) {\n this.viewer.dynamics.position.setValue({\n yaw: props.yaw,\n pitch: props.pitch,\n });\n }\n if (zoomProvided) {\n this.viewer.dynamics.zoom.setValue(props.zoom);\n }\n\n this.viewer.needsUpdate();\n },\n });\n\n animation.then((completed) => {\n if (completed) {\n // remove temp sphere and transfer the texture to the main mesh\n this.setTexture(textureData);\n this.viewer.adapter.setTextureOpacity(this.mesh, 1);\n this.setPanoramaPose(textureData.panoData);\n this.setSphereCorrection(options.sphereCorrection);\n\n // actually rotate the camera\n if (positionProvided && options.transition === 'fade-only') {\n this.viewer.rotate(options.position);\n }\n } else {\n this.viewer.adapter.disposeTexture(textureData);\n }\n\n this.scene.remove(group);\n mesh.geometry.dispose();\n mesh.geometry = null;\n });\n\n return animation;\n }\n\n /**\n * Returns intersections with objects in the scene\n */\n getIntersections(viewerPoint: Point): Array> {\n vector2.x = (2 * viewerPoint.x) / this.state.size.width - 1;\n vector2.y = (-2 * viewerPoint.y) / this.state.size.height + 1;\n\n this.raycaster.setFromCamera(vector2, this.camera);\n\n const intersections = this.raycaster\n .intersectObjects(this.scene.children, true)\n .filter((i) => (i.object as Mesh).isMesh && !!i.object.userData) as Array>;\n\n if (this.customRenderer?.getIntersections) {\n intersections.push(...this.customRenderer.getIntersections(this.raycaster, vector2));\n }\n\n return intersections;\n }\n\n /**\n * Adds an object to the THREE scene\n */\n addObject(object: Object3D) {\n this.scene.add(object);\n }\n\n /**\n * Removes an object from the THREE scene\n */\n removeObject(object: Object3D) {\n this.scene.remove(object);\n }\n\n /**\n * Calls `dispose` on all objects and textures\n * @internal\n */\n cleanScene(object: any) {\n object.traverse((item: any) => {\n if (item.geometry) {\n item.geometry.dispose();\n }\n\n if (item.material) {\n if (Array.isArray(item.material)) {\n item.material.forEach((material: any) => {\n if (material.map) {\n material.map.dispose();\n }\n\n material.dispose();\n });\n } else {\n if (item.material.map) {\n item.material.map.dispose();\n }\n\n item.material.dispose();\n }\n }\n\n if (item.dispose && !(item instanceof Scene)) {\n item.dispose();\n }\n\n if (item !== object) {\n this.cleanScene(item);\n }\n });\n }\n}\n","import { FileLoader, ImageLoader } from 'three';\nimport { PSVError } from '../PSVError';\nimport type { Viewer } from '../Viewer';\nimport { Cache } from '../data/cache';\nimport { AbstractService } from './AbstractService';\n\n/**\n * Image and texture loading system\n */\nexport class TextureLoader extends AbstractService {\n private readonly fileLoader: FileLoader;\n private readonly imageLoader: ImageLoader;\n\n /**\n * @internal\n */\n constructor(viewer: Viewer) {\n super(viewer);\n\n this.fileLoader = new FileLoader();\n this.fileLoader.setResponseType('blob');\n\n this.imageLoader = new ImageLoader();\n\n if (this.config.withCredentials) {\n this.fileLoader.setWithCredentials(true);\n this.imageLoader.setCrossOrigin('use-credentials');\n }\n }\n\n /**\n * @internal\n */\n override destroy() {\n this.abortLoading();\n super.destroy();\n }\n\n /**\n * Cancels current HTTP requests\n * @internal\n */\n abortLoading() {\n // noop implementation waiting for https://github.com/mrdoob/three.js/pull/23070\n }\n\n /**\n * Loads a Blob with FileLoader\n */\n loadFile(url: string, onProgress?: (p: number) => void, cacheKey?: string): Promise {\n const cached = Cache.get(url, cacheKey);\n\n if (cached) {\n if (cached instanceof Blob) {\n onProgress?.(100);\n return Promise.resolve(cached);\n } else {\n // unlikely case when the image has already been loaded with the ImageLoader\n Cache.remove(url, cacheKey);\n }\n }\n\n if (this.config.requestHeaders) {\n this.fileLoader.setRequestHeader(this.config.requestHeaders(url));\n }\n\n return new Promise((resolve, reject) => {\n let progress = 0;\n onProgress?.(progress);\n\n this.fileLoader.load(\n url,\n (result) => {\n progress = 100;\n onProgress?.(progress);\n Cache.add(url, cacheKey, result as any);\n resolve(result as any);\n },\n (e) => {\n if (e.lengthComputable) {\n const newProgress = (e.loaded / e.total) * 100;\n if (newProgress > progress) {\n progress = newProgress;\n onProgress?.(progress);\n }\n }\n },\n (err) => {\n reject(err);\n }\n );\n });\n }\n\n /**\n * Loads an image with ImageLoader or with FileLoader if progress is tracked or if request headers are configured\n */\n loadImage(url: string, onProgress?: (p: number) => void, cacheKey?: string): Promise {\n const cached = Cache.get(url, cacheKey);\n\n if (cached) {\n onProgress?.(100);\n if (cached instanceof Blob) {\n // unlikely case when the image has already been loaded with the FileLoader\n return this.blobToImage(cached);\n } else {\n return Promise.resolve(cached);\n }\n }\n\n if (!onProgress && !this.config.requestHeaders) {\n return this.imageLoader.loadAsync(url)\n .then((result) => {\n Cache.add(url, cacheKey, result);\n return result;\n });\n } else {\n return this.loadFile(url, onProgress, cacheKey).then((blob) => this.blobToImage(blob));\n }\n }\n\n /**\n * Converts a file loaded with {@link loadFile} into an image\n */\n blobToImage(blob: Blob): Promise {\n return new Promise((resolve, reject) => {\n const img = document.createElement('img');\n img.onload = () => {\n URL.revokeObjectURL(img.src);\n resolve(img);\n };\n img.onerror = reject;\n img.src = URL.createObjectURL(blob);\n });\n }\n\n /**\n * Preload a panorama file without displaying it\n */\n preloadPanorama(panorama: any): Promise {\n if (this.viewer.adapter.supportsPreload(panorama)) {\n return this.viewer.adapter.loadTexture(panorama);\n } else {\n return Promise.reject(new PSVError('Current adapter does not support preload'));\n }\n }\n}\n","import { MathUtils } from 'three';\nimport { Dynamic, MultiDynamic } from '../utils';\nimport type { Viewer } from '../Viewer';\nimport { PositionUpdatedEvent, ZoomUpdatedEvent } from '../events';\nimport { AbstractService } from './AbstractService';\n\nexport class ViewerDynamics extends AbstractService {\n readonly zoom = new Dynamic(\n (zoomLevel) => {\n this.viewer.state.vFov = this.viewer.dataHelper.zoomLevelToFov(zoomLevel);\n this.viewer.state.hFov = this.viewer.dataHelper.vFovToHFov(this.viewer.state.vFov);\n this.viewer.dispatchEvent(new ZoomUpdatedEvent(zoomLevel));\n },\n {\n defaultValue: this.viewer.config.defaultZoomLvl,\n min: 0,\n max: 100,\n wrap: false,\n }\n );\n\n readonly position = new MultiDynamic(\n (position) => {\n this.viewer.dataHelper.sphericalCoordsToVector3(position, this.viewer.state.direction);\n this.viewer.dispatchEvent(new PositionUpdatedEvent(position));\n },\n {\n yaw: new Dynamic(null, {\n defaultValue: this.config.defaultYaw,\n min: 0,\n max: 2 * Math.PI,\n wrap: true,\n }),\n pitch: new Dynamic(null, {\n defaultValue: this.config.defaultPitch,\n min: !this.viewer.state.littlePlanet ? -Math.PI / 2 : 0,\n max: !this.viewer.state.littlePlanet ? Math.PI / 2 : Math.PI * 2,\n wrap: this.viewer.state.littlePlanet,\n }),\n }\n );\n\n /**\n * @internal\n */\n constructor(viewer: Viewer) {\n super(viewer);\n this.updateSpeeds();\n }\n\n /**\n * @internal\n */\n updateSpeeds() {\n this.zoom.setSpeed(this.config.zoomSpeed * 50);\n this.position.setSpeed(MathUtils.degToRad(this.config.moveSpeed * 50));\n }\n\n /**\n * @internal\n */\n update(elapsed: number) {\n this.zoom.update(elapsed);\n this.position.update(elapsed);\n }\n}\n","import { Mesh, Vector3 } from 'three';\nimport { SPHERE_RADIUS } from '../data/constants';\nimport { PanoData, Size, TextureData } from '../model';\nimport type { Animation } from '../utils';\n\n/**\n * Internal properties of the viewer\n */\nexport class ViewerState {\n /**\n * when all components are loaded\n */\n ready = false;\n\n /**\n * if the view needs to be renderer\n */\n needsUpdate = false;\n\n /**\n * number of plugins requesting to continuously render the scene\n */\n continuousUpdateCount = 0;\n\n /**\n * if the keyboard events are currently listened to\n */\n keyboardEnabled = false;\n\n /**\n * direction of the camera\n */\n direction = new Vector3(0, 0, SPHERE_RADIUS);\n\n /**\n * vertical FOV\n */\n vFov = 60;\n\n /**\n * horizontal FOV\n */\n hFov = 60;\n\n /**\n * renderer aspect ratio\n */\n aspect = 1;\n\n /**\n * currently running animation\n */\n animation: Animation = null;\n\n /**\n * currently running transition\n */\n transitionAnimation: Animation = null;\n\n /**\n * promise of the last \"setPanorama()\" call\n */\n loadingPromise: Promise = null;\n\n /**\n * special tweaks for LittlePlanetAdapter\n */\n littlePlanet = false;\n\n /**\n * time of the last user action\n */\n idleTime = -1;\n\n /**\n * registered THREE objects observer\n */\n objectsObservers: Record = {};\n\n /**\n * size of the container\n */\n size: Size = {\n width: 0,\n height: 0,\n };\n\n /**\n * Current panorama texture displayed\n */\n textureData: TextureData;\n\n /**\n * Current overlay texture displayed\n */\n overlayData: TextureData;\n\n /**\n * panorama metadata, if supported\n */\n panoData: PanoData = {\n fullWidth: 0,\n fullHeight: 0,\n croppedWidth: 0,\n croppedHeight: 0,\n croppedX: 0,\n croppedY: 0,\n poseHeading: 0,\n posePitch: 0,\n poseRoll: 0,\n };\n\n /**\n * Current override of the global cursor\n */\n cursorOverride: string;\n\n /**\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n constructor() {}\n}\n","import type { AbstractAdapter } from './adapters/AbstractAdapter';\nimport type { AbstractComponent } from './components/AbstractComponent';\nimport { Loader } from './components/Loader';\nimport { Navbar } from './components/Navbar';\nimport { Notification } from './components/Notification';\nimport { Overlay } from './components/Overlay';\nimport { Panel } from './components/Panel';\nimport { Tooltip, TooltipConfig } from './components/Tooltip';\nimport { Cache } from './data/cache';\nimport { CONFIG_PARSERS, DEFAULTS, getViewerConfig, READONLY_OPTIONS } from './data/config';\nimport { DEFAULT_TRANSITION, IDS, VIEWER_DATA } from './data/constants';\nimport { SYSTEM } from './data/system';\nimport {\n BeforeAnimateEvent,\n BeforeRotateEvent,\n ConfigChangedEvent,\n PanoramaErrorEvent,\n PanoramaLoadedEvent,\n ReadyEvent,\n SizeUpdatedEvent,\n StopAllEvent,\n ViewerEvents,\n ZoomUpdatedEvent,\n} from './events';\nimport errorIcon from './icons/error.svg';\nimport { TypedEventTarget } from './lib/TypedEventTarget';\nimport {\n AnimateOptions,\n CssSize,\n ExtendedPosition,\n PanoramaOptions,\n ParsedViewerConfig,\n Position,\n Size,\n UpdatableViewerConfig,\n ViewerConfig,\n} from './model';\nimport type { AbstractPlugin, PluginConstructor } from './plugins/AbstractPlugin';\nimport { pluginInterop } from './plugins/AbstractPlugin';\nimport { PSVError } from './PSVError';\nimport { DataHelper } from './services/DataHelper';\nimport { EventsHandler } from './services/EventsHandler';\nimport { Renderer } from './services/Renderer';\nimport { TextureLoader } from './services/TextureLoader';\nimport { ViewerDynamics } from './services/ViewerDynamics';\nimport { ViewerState } from './services/ViewerState';\nimport {\n Animation,\n checkStylesheet,\n exitFullscreen,\n getAbortError,\n getElement,\n isAbortError,\n isExtendedPosition,\n isFullscreenEnabled,\n isNil,\n logWarn,\n requestFullscreen,\n resolveBoolean,\n throttle,\n toggleClass,\n} from './utils';\n\n/**\n * Photo Sphere Viewer controller\n */\nexport class Viewer extends TypedEventTarget {\n readonly state: ViewerState;\n readonly config: ParsedViewerConfig;\n\n readonly parent: HTMLElement;\n readonly container: HTMLElement;\n\n /** @internal */\n readonly adapter: AbstractAdapter;\n /** @internal */\n readonly plugins: Record> = {};\n /** @internal */\n readonly dynamics: ViewerDynamics;\n\n readonly renderer: Renderer;\n readonly textureLoader: TextureLoader;\n /** @internal */\n readonly eventsHandler: EventsHandler;\n readonly dataHelper: DataHelper;\n\n readonly loader: Loader;\n readonly navbar: Navbar;\n readonly notification: Notification;\n readonly overlay: Overlay;\n readonly panel: Panel;\n\n /** @internal */\n readonly children: AbstractComponent[] = [];\n\n private readonly onResize = throttle(() => this.navbar.autoSize(), 500);\n\n constructor(config: ViewerConfig) {\n super();\n\n Cache.init();\n SYSTEM.load();\n\n this.state = new ViewerState();\n this.config = getViewerConfig(config);\n\n this.parent = getElement(config.container);\n // @ts-ignore\n this.parent[VIEWER_DATA] = this;\n\n this.container = document.createElement('div');\n this.container.classList.add('psv-container');\n this.parent.appendChild(this.container);\n\n checkStylesheet(this.container, 'core');\n\n // @ts-ignore\n this.adapter = new this.config.adapter[0](this, this.config.adapter[1]);\n\n this.renderer = new Renderer(this);\n this.textureLoader = new TextureLoader(this);\n this.eventsHandler = new EventsHandler(this);\n this.dataHelper = new DataHelper(this);\n this.dynamics = new ViewerDynamics(this);\n\n this.adapter.init?.();\n\n this.loader = new Loader(this);\n this.navbar = new Navbar(this);\n this.panel = new Panel(this);\n this.notification = new Notification(this);\n this.overlay = new Overlay(this);\n\n // init\n this.resize(this.config.size);\n this.setCursor(null);\n\n resolveBoolean(SYSTEM.isTouchEnabled, (enabled) => {\n toggleClass(this.container, 'psv--is-touch', enabled);\n });\n\n // init plugins\n this.config.plugins.forEach(([plugin, opts]) => {\n // @ts-ignore\n this.plugins[plugin.id] = new plugin(this, opts);\n });\n for (const plugin of Object.values(this.plugins)) {\n plugin.init?.();\n }\n\n // init buttons\n if (this.config.navbar) {\n this.navbar.setButtons(this.config.navbar);\n }\n\n // load panorama\n if (!this.state.loadingPromise) {\n if (this.config.panorama) {\n this.setPanorama(this.config.panorama);\n } else {\n this.loader.show();\n }\n }\n }\n\n /**\n * Destroys the viewer\n */\n destroy() {\n this.stopAll();\n this.stopKeyboardControl();\n this.exitFullscreen();\n\n for (const [id, plugin] of Object.entries(this.plugins)) {\n plugin.destroy();\n delete this.plugins[id];\n }\n\n this.children.slice().forEach((child) => child.destroy());\n this.children.length = 0;\n\n this.eventsHandler.destroy();\n this.renderer.destroy();\n this.textureLoader.destroy();\n this.dataHelper.destroy();\n this.adapter.destroy();\n this.dynamics.destroy();\n\n this.parent.removeChild(this.container);\n // @ts-ignore\n delete this.parent[VIEWER_DATA];\n }\n\n private init() {\n this.eventsHandler.init();\n this.renderer.init();\n\n if (this.config.navbar) {\n this.navbar.show();\n }\n\n if (this.config.keyboard === 'always') {\n this.startKeyboardControl();\n }\n\n this.resetIdleTimer();\n\n this.state.ready = true;\n\n this.dispatchEvent(new ReadyEvent());\n }\n\n /**\n * Restarts the idle timer\n * @internal\n */\n resetIdleTimer() {\n this.state.idleTime = performance.now();\n }\n\n /**\n * Stops the idle timer\n * @internal\n */\n disableIdleTimer() {\n this.state.idleTime = -1;\n }\n\n /**\n * Returns the instance of a plugin if it exists\n * @example By plugin identifier\n * ```js\n * viewer.getPlugin('markers')\n * ```\n * @example By plugin class with TypeScript support\n * ```ts\n * viewer.getPlugin(MarkersPlugin)\n * ```\n */\n getPlugin>(pluginId: string | PluginConstructor): T {\n if (typeof pluginId === 'string') {\n return this.plugins[pluginId] as T;\n } else {\n const pluginCtor = pluginInterop(pluginId);\n return pluginCtor ? (this.plugins[pluginCtor.id] as T) : null;\n }\n }\n\n /**\n * Returns the current position of the camera\n */\n getPosition(): Position {\n return this.dataHelper.cleanPosition(this.dynamics.position.current);\n }\n\n /**\n * Returns the current zoom level\n */\n getZoomLevel(): number {\n return this.dynamics.zoom.current;\n }\n\n /**\n * Returns the current viewer size\n */\n getSize(): Size {\n return { ...this.state.size };\n }\n\n /**\n * Checks if the viewer is in fullscreen\n */\n isFullscreenEnabled(): boolean {\n return isFullscreenEnabled(this.parent);\n }\n\n /**\n * Request a new render of the scene\n */\n needsUpdate() {\n this.state.needsUpdate = true;\n }\n\n /**\n * Request the scene to be continuously renderer (when using videos)\n */\n needsContinuousUpdate(enabled: boolean) {\n if (enabled) {\n this.state.continuousUpdateCount++;\n } else if (this.state.continuousUpdateCount > 0) {\n this.state.continuousUpdateCount--;\n }\n }\n\n /**\n * Resizes the scene if the viewer is resized\n */\n autoSize() {\n if (\n this.container.clientWidth !== this.state.size.width\n || this.container.clientHeight !== this.state.size.height\n ) {\n this.state.size.width = Math.round(this.container.clientWidth);\n this.state.size.height = Math.round(this.container.clientHeight);\n this.state.aspect = this.state.size.width / this.state.size.height;\n this.state.hFov = this.dataHelper.vFovToHFov(this.state.vFov);\n\n this.dispatchEvent(new SizeUpdatedEvent(this.getSize()));\n this.onResize();\n }\n }\n\n /**\n * Loads a new panorama file\n * @description Loads a new panorama file, optionally changing the camera position/zoom and activating the transition animation.
\n * If the \"options\" parameter is not defined, the camera will not move and the ongoing animation will continue.
\n * If another loading is already in progress it will be aborted.\n * @returns promise resolved with false if the loading was aborted by another call\n */\n setPanorama(path: any, options: PanoramaOptions = {}): Promise {\n this.textureLoader.abortLoading();\n this.state.transitionAnimation?.cancel();\n\n // apply default parameters on first load\n if (!this.state.ready) {\n ['sphereCorrection', 'panoData', 'overlay', 'overlayOpacity'].forEach((opt) => {\n if (!(opt in options)) {\n // @ts-ignore\n options[opt] = this.config[opt];\n }\n });\n }\n\n if (isExtendedPosition(options)) {\n logWarn(`PanoramaOptions.yaw and PanoramaOptions.pitch are deprecated, use PanoramaOptions.position instead`);\n (options as PanoramaOptions).position = this.dataHelper.cleanPosition(options);\n }\n if (typeof options.transition === 'number') {\n logWarn(`Use PanoramaOptions.speed to define the speed/duration of the transition`);\n options.speed = options.transition;\n options.transition = true;\n }\n\n if (options.transition === undefined) {\n options.transition = true;\n }\n if (options.speed === undefined) {\n options.speed = DEFAULT_TRANSITION;\n }\n if (options.showLoader === undefined) {\n options.showLoader = true;\n }\n if (options.caption === undefined) {\n options.caption = this.config.caption;\n }\n if (options.description === undefined) {\n options.description = this.config.description;\n }\n if (!options.panoData && typeof this.config.panoData === 'function') {\n options.panoData = this.config.panoData;\n }\n\n const positionProvided = !isNil(options.position);\n const zoomProvided = !isNil(options.zoom);\n\n if (positionProvided || zoomProvided) {\n this.stopAll();\n }\n\n this.hideError();\n this.resetIdleTimer();\n\n this.config.panorama = path;\n this.config.caption = options.caption;\n this.config.description = options.description;\n\n const done = (err?: Error) => {\n this.loader.hide();\n\n this.state.loadingPromise = null;\n\n if (isAbortError(err)) {\n return false;\n } else if (err) {\n this.navbar.setCaption('');\n this.showError(this.config.lang.loadError);\n console.error(err);\n this.dispatchEvent(new PanoramaErrorEvent(path, err));\n throw err;\n } else {\n this.setOverlay(options.overlay, options.overlayOpacity);\n this.navbar.setCaption(this.config.caption);\n return true;\n }\n };\n\n this.navbar.setCaption(`${this.config.loadingTxt || ''}`);\n if (options.showLoader || !this.state.ready) {\n this.loader.show();\n }\n\n const loadingPromise = this.adapter.loadTexture(this.config.panorama, options.panoData).then((textureData) => {\n // check if another panorama was requested\n if (textureData.panorama !== this.config.panorama) {\n this.adapter.disposeTexture(textureData);\n throw getAbortError();\n }\n return textureData;\n });\n\n if (!options.transition || !this.state.ready || !this.adapter.supportsTransition(this.config.panorama)) {\n this.state.loadingPromise = loadingPromise\n .then((textureData) => {\n this.renderer.show();\n this.renderer.setTexture(textureData);\n this.renderer.setPanoramaPose(textureData.panoData);\n this.renderer.setSphereCorrection(options.sphereCorrection);\n\n if (!this.state.ready) {\n this.init();\n }\n\n this.dispatchEvent(new PanoramaLoadedEvent(textureData));\n\n if (zoomProvided) {\n this.zoom(options.zoom);\n }\n if (positionProvided) {\n this.rotate(options.position);\n }\n })\n .then(\n () => done(),\n (err) => done(err)\n );\n } else {\n this.state.loadingPromise = loadingPromise\n .then((textureData) => {\n this.loader.hide();\n\n this.dispatchEvent(new PanoramaLoadedEvent(textureData));\n\n this.state.transitionAnimation = this.renderer.transition(textureData, options);\n return this.state.transitionAnimation;\n })\n .then((completed) => {\n this.state.transitionAnimation = null;\n if (!completed) {\n throw getAbortError();\n }\n })\n .then(\n () => done(),\n (err) => done(err)\n );\n }\n\n return this.state.loadingPromise;\n }\n\n /**\n * Loads a new overlay\n */\n setOverlay(path: any, opacity = this.config.overlayOpacity): Promise {\n const supportsOverlay = (this.adapter.constructor as typeof AbstractAdapter).supportsOverlay;\n\n if (!path) {\n if (supportsOverlay) {\n this.renderer.setOverlay(null, 0);\n }\n\n return Promise.resolve();\n } else {\n if (!supportsOverlay) {\n return Promise.reject(new PSVError(`Current adapter does not supports overlay`));\n }\n\n return this.adapter\n .loadTexture(\n path,\n (image) => {\n const p = this.state.panoData;\n const r = image.width / p.croppedWidth;\n return {\n fullWidth: r * p.fullWidth,\n fullHeight: r * p.fullHeight,\n croppedWidth: r * p.croppedWidth,\n croppedHeight: r * p.croppedHeight,\n croppedX: r * p.croppedX,\n croppedY: r * p.croppedY,\n };\n },\n false\n )\n .then((textureData) => {\n this.renderer.setOverlay(textureData, opacity);\n });\n }\n }\n\n /**\n * Update options\n * @throws {@link PSVError} if the configuration is invalid\n */\n setOptions(options: Partial) {\n const rawConfig: ViewerConfig = {\n ...this.config,\n ...options,\n };\n\n for (let [key, value] of Object.entries(options) as Array<[keyof typeof rawConfig, any]>) {\n if (!(key in DEFAULTS)) {\n logWarn(`Unknown option ${key}`);\n continue;\n }\n\n if (key in READONLY_OPTIONS) {\n logWarn((READONLY_OPTIONS as any)[key]);\n continue;\n }\n\n if (key in CONFIG_PARSERS) {\n // @ts-ignore\n value = CONFIG_PARSERS[key](value, {\n rawConfig: rawConfig,\n defValue: DEFAULTS[key],\n } as any);\n }\n\n // @ts-ignore\n this.config[key] = value;\n\n switch (key) {\n case 'mousemove':\n if (!this.state.cursorOverride) {\n this.setCursor(null);\n }\n break;\n\n case 'caption':\n this.navbar.setCaption(this.config.caption);\n break;\n\n case 'size':\n this.resize(this.config.size);\n break;\n\n case 'sphereCorrection':\n this.renderer.setSphereCorrection(this.config.sphereCorrection);\n break;\n\n case 'navbar':\n case 'lang':\n this.navbar.setButtons(this.config.navbar);\n break;\n\n case 'moveSpeed':\n case 'zoomSpeed':\n this.dynamics.updateSpeeds();\n break;\n\n case 'minFov':\n case 'maxFov':\n this.dynamics.zoom.setValue(this.dataHelper.fovToZoomLevel(this.state.vFov));\n this.dispatchEvent(new ZoomUpdatedEvent(this.getZoomLevel()));\n break;\n\n case 'keyboard':\n if (this.config.keyboard === 'always') {\n this.startKeyboardControl();\n } else {\n this.stopKeyboardControl();\n }\n break;\n\n default:\n break;\n }\n }\n\n this.needsUpdate();\n\n this.dispatchEvent(new ConfigChangedEvent(Object.keys(options) as any));\n }\n\n /**\n * Update options\n * @throws {@link PSVError} if the configuration is invalid\n */\n setOption(option: T, value: UpdatableViewerConfig[T]) {\n this.setOptions({ [option]: value });\n }\n\n /**\n * Displays an error message over the viewer\n */\n showError(message: string) {\n this.overlay.show({\n id: IDS.ERROR,\n image: errorIcon,\n title: message,\n dissmisable: false,\n });\n }\n\n /**\n * Hides the error message\n */\n hideError() {\n this.overlay.hide(IDS.ERROR);\n }\n\n /**\n * Rotates the view to specific position\n */\n rotate(position: ExtendedPosition) {\n const e = new BeforeRotateEvent(this.dataHelper.cleanPosition(position));\n this.dispatchEvent(e);\n\n if (e.defaultPrevented) {\n return;\n }\n\n this.dynamics.position.setValue(e.position);\n }\n\n /**\n * Zooms to a specific level between `maxFov` and `minFov`\n */\n zoom(level: number) {\n this.dynamics.zoom.setValue(level);\n }\n\n /**\n * Increases the zoom level\n */\n zoomIn(step = 1) {\n this.dynamics.zoom.step(step);\n }\n\n /**\n * Decreases the zoom level\n */\n zoomOut(step = 1) {\n this.dynamics.zoom.step(-step);\n }\n\n /**\n * Rotates and zooms the view with a smooth animation\n */\n animate(options: AnimateOptions): Animation {\n const positionProvided = isExtendedPosition(options);\n const zoomProvided = !isNil(options.zoom);\n\n const e = new BeforeAnimateEvent(\n positionProvided ? this.dataHelper.cleanPosition(options) : undefined,\n options.zoom\n );\n this.dispatchEvent(e);\n\n if (e.defaultPrevented) {\n return;\n }\n\n this.stopAll();\n\n const { duration, properties } = this.dataHelper.getAnimationProperties(options.speed, e.position, e.zoomLevel);\n\n // if no animation needed\n if (!duration) {\n if (positionProvided) {\n this.rotate(e.position);\n }\n if (zoomProvided) {\n this.zoom(e.zoomLevel);\n }\n\n return new Animation(null);\n }\n\n this.state.animation = new Animation({\n properties: properties,\n duration: duration,\n easing: 'inOutSine',\n onTick: (props) => {\n if (positionProvided) {\n this.dynamics.position.setValue({\n yaw: props.yaw,\n pitch: props.pitch,\n });\n }\n if (zoomProvided) {\n this.dynamics.zoom.setValue(props.zoom);\n }\n },\n });\n\n this.state.animation.then(() => {\n this.state.animation = null;\n this.resetIdleTimer();\n });\n\n return this.state.animation;\n }\n\n /**\n * Stops the ongoing animation\n * @description The return value is a Promise because the is no guaranty the animation can be stopped synchronously.\n */\n stopAnimation(): PromiseLike {\n if (this.state.animation) {\n this.state.animation.cancel();\n return this.state.animation;\n } else {\n return Promise.resolve();\n }\n }\n\n /**\n * Resizes the viewer\n */\n resize(size: CssSize) {\n const s = size as any;\n (['width', 'height'] as Array<'width' | 'height'>).forEach((dim) => {\n if (size && s[dim]) {\n if (/^[0-9.]+$/.test(s[dim])) {\n s[dim] += 'px';\n }\n this.parent.style[dim] = s[dim];\n }\n });\n\n this.autoSize();\n }\n\n /**\n * Enters the fullscreen mode\n */\n enterFullscreen() {\n if (!this.isFullscreenEnabled()) {\n requestFullscreen(this.parent);\n }\n }\n\n /**\n * Exits the fullscreen mode\n */\n exitFullscreen() {\n if (this.isFullscreenEnabled()) {\n exitFullscreen();\n }\n }\n\n /**\n * Enters or exits the fullscreen mode\n */\n toggleFullscreen() {\n if (!this.isFullscreenEnabled()) {\n this.enterFullscreen();\n } else {\n this.exitFullscreen();\n }\n }\n\n /**\n * Enables the keyboard controls\n */\n startKeyboardControl() {\n this.state.keyboardEnabled = true;\n }\n\n /**\n * Disables the keyboard controls\n */\n stopKeyboardControl() {\n this.state.keyboardEnabled = false;\n }\n\n /**\n * Creates a new tooltip\n * @description Use {@link Tooltip.move} to update the tooltip without re-create\n * @throws {@link PSVError} if the configuration is invalid\n */\n createTooltip(config: TooltipConfig): Tooltip {\n return new Tooltip(this, config);\n }\n\n /**\n * Changes the global mouse cursor\n */\n setCursor(cursor: string) {\n this.state.cursorOverride = cursor;\n if (!cursor) {\n this.container.style.cursor = this.config.mousemove ? 'move' : 'default';\n } else {\n this.container.style.cursor = cursor;\n }\n }\n\n /**\n * Subscribes to events on objects in the three.js scene\n * @param userDataKey - only objects with the following `userData` will be observed\n */\n observeObjects(userDataKey: string): void {\n if (!this.state.objectsObservers[userDataKey]) {\n this.state.objectsObservers[userDataKey] = null;\n }\n }\n\n /**\n * Unsubscribes to events on objects\n */\n unobserveObjects(userDataKey: string): void {\n delete this.state.objectsObservers[userDataKey];\n }\n\n /**\n * Stops all current animations\n * @internal\n */\n stopAll(): PromiseLike {\n this.dispatchEvent(new StopAllEvent());\n\n this.disableIdleTimer();\n\n return this.stopAnimation();\n }\n}\n"],"mappings":"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","names":["Cache","ACTIONS","target","src","angle","MathUtils","MathUtils","SliderDirection","MathUtils","Mesh","MathUtils","Mesh","getConfig","angle","MathUtils","MathUtils","angle","Euler","MathUtils","Vector3","Vector3","Euler","MathUtils","distance","MathUtils","MathUtils","Vector2","Vector3","Vector2","Vector3","MathUtils","MathUtils","Vector3","Vector3","Cache"]}