@lumiscaphe/viewer 3.1.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/README.md +14 -2
- package/dist/Canvas2D.d.ts +5 -4
- package/dist/Canvas3D.d.ts +1 -1
- package/dist/InteractivePosition.d.ts +9 -4
- package/dist/Loader.d.ts +1 -0
- package/dist/Position.d.ts +4 -0
- package/dist/Scene.d.ts +3 -1
- package/dist/Transition.d.ts +3 -2
- package/dist/WebRenderStatic.d.ts +9 -0
- package/dist/Widget.d.ts +2 -1
- package/dist/WidgetImage.d.ts +2 -1
- package/dist/WidgetVRCube.d.ts +2 -1
- package/dist/WidgetVRObject.d.ts +6 -4
- package/dist/WidgetVideo.d.ts +2 -1
- package/dist/index.es.js +2 -2
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +8 -6
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/Resolution.ts","../src/Viewport.ts","../src/Canvas2D.ts","../src/Canvas3D.ts","../src/Maths.ts","../src/WebRenderV1.ts","../src/WebRenderV2.ts","../node_modules/tslib/tslib.es6.js","../src/Loader.ts","../src/Video.ts","../src/WidgetImage.ts","../src/WidgetVideo.ts","../src/Point.ts","../src/EventHelper.ts","../src/Basis3.ts","../src/InertiaPoint.ts","../src/Inertia.ts","../src/PointOfView.ts","../src/InteractiveCamera.ts","../src/WidgetVRCube.ts","../src/InteractivePosition.ts","../src/WidgetVRObject.ts","../src/WRAPIv2.ts","../node_modules/style-inject/dist/style-inject.es.js","../src/Viewer.ts"],"sourcesContent":["export class Resolution {\r\n constructor(width, height) {\r\n this.width = width;\r\n this.height = height;\r\n }\r\n get aspect() {\r\n return this.width / this.height;\r\n }\r\n}\r\n","import { Resolution } from './Resolution';\r\nexport class Viewport {\r\n constructor(top, left, width, height) {\r\n this.top = top;\r\n this.left = left;\r\n this.width = width;\r\n this.height = height;\r\n }\r\n static fit(resolution, viewportResolution, fit) {\r\n const aspectRatio = resolution.aspect;\r\n const viewportRatio = viewportResolution.aspect;\r\n let width = 0;\r\n let height = 0;\r\n switch (fit) {\r\n case 'contain':\r\n width = viewportRatio < aspectRatio ? viewportResolution.width : viewportResolution.height * aspectRatio;\r\n height = viewportRatio < aspectRatio ? viewportResolution.width / aspectRatio : viewportResolution.height;\r\n break;\r\n case 'cover':\r\n default:\r\n width = viewportRatio < aspectRatio ? viewportResolution.height * aspectRatio : viewportResolution.width;\r\n height = viewportRatio < aspectRatio ? viewportResolution.height : viewportResolution.width / aspectRatio;\r\n break;\r\n case 'fill':\r\n width = viewportResolution.width;\r\n height = viewportResolution.height;\r\n break;\r\n }\r\n const top = (viewportResolution.height - height) / 2;\r\n const left = (viewportResolution.width - width) / 2;\r\n return new Viewport(top, left, width, height);\r\n }\r\n static getStandardAspectRatio(width, height) {\r\n if (width === 0 || height === 0) {\r\n return 0;\r\n }\r\n const aspectRatio = width / height;\r\n if (width < height) {\r\n const distanceTo34 = Math.abs(3 / 4 - aspectRatio);\r\n const distanceTo916 = Math.abs(9 / 16 - aspectRatio);\r\n return distanceTo34 < distanceTo916 ? 3 / 4 : 9 / 16;\r\n }\r\n const distanceTo43 = Math.abs(4 / 3 - aspectRatio);\r\n const distanceTo169 = Math.abs(16 / 9 - aspectRatio);\r\n return distanceTo43 < distanceTo169 ? 4 / 3 : 16 / 9;\r\n }\r\n static getStandardResolution(width, height) {\r\n if (width === 0 || height === 0) {\r\n return new Resolution(0, 0);\r\n }\r\n const aspectRatio = Viewport.getStandardAspectRatio(width, height);\r\n if (width < height) {\r\n const quality = Viewport.getStandardQuality(Math.max(height * aspectRatio, width));\r\n return new Resolution(Math.round(quality), Math.round(quality / aspectRatio));\r\n }\r\n const quality = Viewport.getStandardQuality(Math.max(width / aspectRatio, height));\r\n return new Resolution(Math.round(quality * aspectRatio), Math.round(quality));\r\n }\r\n static getStandardQuality(height) {\r\n if (height <= 240) {\r\n return 240;\r\n }\r\n if (height <= 360) {\r\n return 360;\r\n }\r\n if (height <= 480) {\r\n return 480;\r\n }\r\n if (height <= 720) {\r\n return 720;\r\n }\r\n return 1080;\r\n }\r\n}\r\n","import { Resolution } from './Resolution';\r\nimport { Viewport } from './Viewport';\r\nexport class Canvas2D {\r\n constructor() {\r\n this.element = document.createElement('canvas');\r\n this.element.classList.add('ls-viewer-canvas');\r\n this.element.style.opacity = '0';\r\n this.context = this.element.getContext('2d');\r\n this.backCanvas = document.createElement('canvas');\r\n this.backContext = this.backCanvas.getContext('2d');\r\n }\r\n destroy() {\r\n if (this.requestAnimationId) {\r\n cancelAnimationFrame(this.requestAnimationId);\r\n this.requestAnimationId = undefined;\r\n }\r\n }\r\n show(useDisplay) {\r\n if (useDisplay) {\r\n this.element.style.display = 'block';\r\n }\r\n else {\r\n this.element.style.opacity = '1';\r\n }\r\n }\r\n hide(useDisplay) {\r\n if (useDisplay) {\r\n this.element.style.display = 'none';\r\n }\r\n else {\r\n this.element.style.opacity = '0';\r\n }\r\n }\r\n resize(width, height, resolution, fit) {\r\n const viewport = Viewport.fit(resolution, new Resolution(width, height), fit);\r\n this.element.style.top = `${viewport.top}px`;\r\n this.element.style.left = `${viewport.left}px`;\r\n this.element.style.width = `${viewport.width}px`;\r\n this.element.style.height = `${viewport.height}px`;\r\n if (resolution.width !== this.element.width || resolution.height !== this.element.height) {\r\n this.element.width = resolution.width;\r\n this.element.height = resolution.height;\r\n this.backCanvas.width = resolution.width;\r\n this.backCanvas.height = resolution.height;\r\n }\r\n }\r\n load(src) {\r\n const image = new Image();\r\n image.onload = () => {\r\n this.draw(image, false);\r\n };\r\n image.src = src;\r\n }\r\n draw(img, fade, speed) {\r\n if (!img) {\r\n return;\r\n }\r\n if (this.requestAnimationId) {\r\n cancelAnimationFrame(this.requestAnimationId);\r\n this.requestAnimationId = undefined;\r\n }\r\n if (fade) {\r\n this.backContext.drawImage(this.element, 0, 0, this.element.width, this.element.height);\r\n this.context.globalAlpha = 0.0;\r\n this.fadeLoop(img, speed || 0);\r\n }\r\n else {\r\n this.context.globalAlpha = 1.0;\r\n this.context.drawImage(img, 0, 0, this.element.width, this.element.height);\r\n }\r\n }\r\n fadeLoop(img, speed) {\r\n if (this.context.globalAlpha >= 1.0) {\r\n cancelAnimationFrame(this.requestAnimationId);\r\n this.requestAnimationId = undefined;\r\n return;\r\n }\r\n const alpha = Math.min(this.context.globalAlpha + speed, 1.0);\r\n this.context.clearRect(0, 0, this.element.width, this.element.height);\r\n this.context.globalAlpha = 1.0;\r\n this.context.drawImage(this.backCanvas, 0, 0, this.element.width, this.element.height);\r\n this.context.globalAlpha = alpha;\r\n this.context.drawImage(img, 0, 0, this.element.width, this.element.height);\r\n this.requestAnimationId = requestAnimationFrame(() => {\r\n this.fadeLoop(img, speed);\r\n });\r\n }\r\n}\r\n","import * as twgl from 'twgl.js';\r\nexport class Canvas3D {\r\n constructor() {\r\n this.element = document.createElement('canvas');\r\n this.element.classList.add('ls-viewer-canvas');\r\n this.element.style.opacity = '0';\r\n this.context = twgl.getContext(this.element, { preserveDrawingBuffer: true });\r\n twgl.setDefaultTextureColor([1, 1, 1, 1]);\r\n }\r\n show() {\r\n this.element.style.opacity = '1';\r\n }\r\n hide() {\r\n this.element.style.opacity = '0';\r\n }\r\n resize() {\r\n this.element.style.width = '100%';\r\n this.element.style.height = '100%';\r\n this.element.style.top = '0';\r\n this.element.style.left = '0';\r\n }\r\n}\r\n","export class Maths {\r\n static accelerate(v, f) {\r\n const factor = f || 1.5;\r\n return (Math.abs(v) ** factor) * (v > 0 ? 1 : -1);\r\n }\r\n static degreesToRadians(a) {\r\n return a * (Math.PI / 180);\r\n }\r\n static radiansToDegrees(a) {\r\n return a * (180 / Math.PI);\r\n }\r\n static mod(x, y) {\r\n return (x - (y * Math.floor(x / y)));\r\n }\r\n}\r\n","export class WebRenderV1 {\r\n constructor(server) {\r\n this.server = server;\r\n }\r\n static buildQuery(request) {\r\n return Object.entries(request).filter(([k, v]) => v !== null && v !== undefined).map(([k, v]) => `${k}=${v}`).join('&');\r\n }\r\n static sceneParameters(snapshot) {\r\n var _a, _b;\r\n const { scene } = snapshot;\r\n const accessory = scene.length > 1 ? scene.find(p => p.accessory) : null;\r\n const decor = scene.length > 1 ? scene.find(p => p.decor) : null;\r\n const product = scene.find(p => p !== accessory && p !== decor);\r\n return {\r\n databaseId: product.database,\r\n configuration: product === null || product === void 0 ? void 0 : product.configuration,\r\n animations: (_a = product === null || product === void 0 ? void 0 : product.animations) === null || _a === void 0 ? void 0 : _a.join('/'),\r\n accessoryDatabaseId: accessory === null || accessory === void 0 ? void 0 : accessory.database,\r\n decorDatabaseId: decor === null || decor === void 0 ? void 0 : decor.database,\r\n decorDeltaAltitude: (_b = decor === null || decor === void 0 ? void 0 : decor.translation) === null || _b === void 0 ? void 0 : _b.y\r\n };\r\n }\r\n static renderParameters(snapshot) {\r\n const { parameters, view } = snapshot;\r\n return {\r\n background: view.background,\r\n width: parameters.width,\r\n height: parameters.height,\r\n softwareAntialiasing: parameters.antialiasing,\r\n superSampling: parameters.superSampling\r\n };\r\n }\r\n static encoderParameters(snapshot) {\r\n const { encoder } = snapshot;\r\n return {\r\n imageFormat: encoder.format,\r\n imageQuality: encoder.quality\r\n };\r\n }\r\n static async fetch(url) {\r\n return fetch(url).then(response => response.text()).then(responseText => {\r\n const xml = responseText.replace(/&/g, '&');\r\n const matches = xml.match(this.xmlRegex);\r\n if (!matches) {\r\n return Promise.reject();\r\n }\r\n return matches.map(m => m.replace(this.xmlRegex, '$1'));\r\n });\r\n }\r\n async animation(snapshot) {\r\n const request = Object.assign(Object.assign(Object.assign(Object.assign({}, WebRenderV1.sceneParameters(snapshot)), { animation: snapshot.view.animation, bookmarkSet: snapshot.view.camera.split('/')[0], bookmark: snapshot.view.camera.split('/')[1], frames: snapshot.view.frames, loop: !!snapshot.view.loop }), WebRenderV1.renderParameters(snapshot)), WebRenderV1.encoderParameters(snapshot));\r\n const queryString = WebRenderV1.buildQuery(request);\r\n return WebRenderV1.fetch(`${this.server}/ImagesFromAnimation?${queryString}`);\r\n }\r\n async image(snapshot) {\r\n const request = Object.assign(Object.assign(Object.assign(Object.assign({}, WebRenderV1.sceneParameters(snapshot)), { bookmarkSet: snapshot.view.camera.split('/')[0], bookmark: snapshot.view.camera.split('/')[1] }), WebRenderV1.renderParameters(snapshot)), WebRenderV1.encoderParameters(snapshot));\r\n const queryString = WebRenderV1.buildQuery(request);\r\n return Promise.resolve(`${this.server}/ImageFromBookmark?${queryString}`);\r\n }\r\n async video(snapshot) {\r\n const request = Object.assign(Object.assign(Object.assign(Object.assign({}, WebRenderV1.sceneParameters(snapshot)), { animation: snapshot.view.animation, bookmarkSet: snapshot.view.camera.split('/')[0], bookmark: snapshot.view.camera.split('/')[1], duration: snapshot.view.duration, frames: snapshot.view.frames, loop: !!snapshot.view.loop, reverse: !!snapshot.view.reverse }), WebRenderV1.renderParameters(snapshot)), WebRenderV1.encoderParameters(snapshot));\r\n const queryString = WebRenderV1.buildQuery(request);\r\n return Promise.resolve(`${this.server}/ImagesFromAnimation?${queryString}`);\r\n }\r\n async vrCube(snapshot) {\r\n const request = Object.assign(Object.assign(Object.assign(Object.assign({}, WebRenderV1.sceneParameters(snapshot)), { bookmarkSet: snapshot.view.camera.split('/')[0], bookmark: snapshot.view.camera.split('/')[1] }), WebRenderV1.renderParameters(snapshot)), WebRenderV1.encoderParameters(snapshot));\r\n request.width = Math.max(request.width, request.height);\r\n request.height = Math.max(request.width, request.height);\r\n const queryString = WebRenderV1.buildQuery(request);\r\n return WebRenderV1.fetch(`${this.server}/CubeFromBookmark?${queryString}`);\r\n }\r\n async vrObject(snapshot) {\r\n const request = Object.assign(Object.assign(Object.assign(Object.assign({}, WebRenderV1.sceneParameters(snapshot)), { bookmarkSet: snapshot.view.camera }), WebRenderV1.renderParameters(snapshot)), WebRenderV1.encoderParameters(snapshot));\r\n const queryString = WebRenderV1.buildQuery(request);\r\n return WebRenderV1.fetch(`${this.server}/ImagesFromBookmarkSet?${queryString}`);\r\n }\r\n}\r\nWebRenderV1.xmlRegex = /directUrl=\"([^\"]*)\"/g;\r\n","import { __rest } from \"tslib\";\r\nexport class WebRenderV2 {\r\n constructor(server) {\r\n this.server = server;\r\n }\r\n static scene(snapshot) {\r\n return snapshot.scene.map(p => {\r\n const { accessory, decor } = p, pResult = __rest(p, [\"accessory\", \"decor\"]);\r\n return pResult;\r\n });\r\n }\r\n static renderParameters(snapshot) {\r\n return Object.assign(Object.assign({}, snapshot.parameters), { superSampling: snapshot.parameters.superSampling.toString() });\r\n }\r\n static encoder(snapshot) {\r\n switch (snapshot.encoder.format) {\r\n case 'jpeg': return {\r\n jpeg: {\r\n quality: snapshot.encoder.quality\r\n }\r\n };\r\n case 'png': return {\r\n png: {\r\n compression: snapshot.encoder.compression\r\n }\r\n };\r\n case 'webp': return {\r\n webp: {\r\n quality: snapshot.encoder.quality\r\n }\r\n };\r\n }\r\n return {\r\n jpeg: {\r\n quality: 80\r\n }\r\n };\r\n }\r\n static async fetchFrame(url, body) {\r\n return fetch(url, { method: 'POST', body: JSON.stringify(body) }).then(response => response.json()).then((data) => {\r\n return data.url;\r\n });\r\n }\r\n static async fetchFrameArray(url, body) {\r\n return fetch(url, { method: 'POST', body: JSON.stringify(body) }).then(response => response.json()).then((data) => {\r\n return data.map(f => f.url);\r\n });\r\n }\r\n static async fetchHotspots(url, body) {\r\n return fetch(url, { method: 'POST', body: JSON.stringify(body) }).then(response => response.json()).then((data) => {\r\n return data;\r\n });\r\n }\r\n static async fetchHotspotsArray(url, body) {\r\n return fetch(url, { method: 'POST', body: JSON.stringify(body) }).then(response => response.json()).then((data) => {\r\n return data;\r\n });\r\n }\r\n async image(snapshot) {\r\n const body = {\r\n scene: WebRenderV2.scene(snapshot),\r\n mode: {\r\n image: {\r\n camera: snapshot.view.camera\r\n }\r\n },\r\n renderParameters: WebRenderV2.renderParameters(snapshot),\r\n encoder: WebRenderV2.encoder(snapshot)\r\n };\r\n return WebRenderV2.fetchFrame(`${this.server}/Snapshot`, body);\r\n }\r\n async vrCube(snapshot) {\r\n const body = {\r\n scene: WebRenderV2.scene(snapshot),\r\n mode: {\r\n vrCube: {\r\n camera: snapshot.view.camera\r\n }\r\n },\r\n renderParameters: WebRenderV2.renderParameters(snapshot),\r\n encoder: WebRenderV2.encoder(snapshot)\r\n };\r\n body.renderParameters.width = Math.max(body.renderParameters.width, body.renderParameters.height);\r\n body.renderParameters.height = Math.max(body.renderParameters.width, body.renderParameters.height);\r\n return WebRenderV2.fetchFrameArray(`${this.server}/Snapshot`, body);\r\n }\r\n async vrObject(snapshot) {\r\n let mode;\r\n if (snapshot.view.cameraGroup) {\r\n mode = {\r\n images: {\r\n cameraGroup: snapshot.view.cameraGroup\r\n }\r\n };\r\n }\r\n else {\r\n if (snapshot.view.frames) {\r\n mode = {\r\n vrObject: {\r\n camera: snapshot.view.camera,\r\n frames: snapshot.view.frames\r\n }\r\n };\r\n }\r\n else {\r\n mode = {\r\n vrObject: {\r\n camera: snapshot.view.camera,\r\n panFrames: snapshot.view.panFrames || 1,\r\n panFrom: snapshot.view.panFrom || 0,\r\n panTo: snapshot.view.panTo || 0,\r\n panLoop: snapshot.view.panLoop || false,\r\n tiltFrames: snapshot.view.tiltFrames || 1,\r\n tiltFrom: snapshot.view.tiltFrom || 0,\r\n tiltTo: snapshot.view.tiltTo || 0,\r\n tiltLoop: snapshot.view.tiltLoop || false\r\n }\r\n };\r\n }\r\n }\r\n const body = {\r\n scene: WebRenderV2.scene(snapshot),\r\n mode,\r\n renderParameters: WebRenderV2.renderParameters(snapshot),\r\n encoder: WebRenderV2.encoder(snapshot)\r\n };\r\n return WebRenderV2.fetchFrameArray(`${this.server}/Snapshot`, body);\r\n }\r\n async animation(snapshot) {\r\n const body = {\r\n scene: WebRenderV2.scene(snapshot),\r\n mode: {\r\n animation: {\r\n id: snapshot.view.animation,\r\n camera: snapshot.view.camera,\r\n fps: snapshot.view.fps,\r\n }\r\n },\r\n renderParameters: WebRenderV2.renderParameters(snapshot),\r\n encoder: WebRenderV2.encoder(snapshot)\r\n };\r\n return WebRenderV2.fetchFrameArray(`${this.server}/Snapshot`, body);\r\n }\r\n async imageHotspots(snapshot, tags) {\r\n const body = {\r\n scene: WebRenderV2.scene(snapshot),\r\n mode: {\r\n image: {\r\n camera: snapshot.view.camera\r\n }\r\n },\r\n renderParameters: WebRenderV2.renderParameters(snapshot),\r\n tags: tags\r\n };\r\n return await WebRenderV2.fetchHotspots(`${this.server}/Hotspot`, body);\r\n }\r\n async vrCubeHotspots(snapshot, tags) {\r\n const body = {\r\n scene: WebRenderV2.scene(snapshot),\r\n mode: {\r\n vrCube: {\r\n camera: snapshot.view.camera\r\n }\r\n },\r\n renderParameters: WebRenderV2.renderParameters(snapshot),\r\n tags\r\n };\r\n body.renderParameters.width = Math.max(body.renderParameters.width, body.renderParameters.height);\r\n body.renderParameters.height = Math.max(body.renderParameters.width, body.renderParameters.height);\r\n return await WebRenderV2.fetchHotspotsArray(`${this.server}/Hotspot`, body);\r\n }\r\n async vrObjectHotspots(snapshot, tags) {\r\n let mode;\r\n if (snapshot.view.cameraGroup) {\r\n mode = {\r\n images: {\r\n cameraGroup: snapshot.view.cameraGroup\r\n }\r\n };\r\n }\r\n else {\r\n if (snapshot.view.frames) {\r\n mode = {\r\n vrObject: {\r\n camera: snapshot.view.camera,\r\n frames: snapshot.view.frames\r\n }\r\n };\r\n }\r\n else {\r\n mode = {\r\n vrObject: {\r\n camera: snapshot.view.camera,\r\n panFrames: snapshot.view.panFrames || 1,\r\n panFrom: snapshot.view.panFrom || 0,\r\n panTo: snapshot.view.panTo || 0,\r\n panLoop: snapshot.view.panLoop || false,\r\n tiltFrames: snapshot.view.tiltFrames || 1,\r\n tiltFrom: snapshot.view.tiltFrom || 0,\r\n tiltTo: snapshot.view.tiltTo || 0,\r\n tiltLoop: snapshot.view.tiltLoop || false\r\n }\r\n };\r\n }\r\n }\r\n const body = {\r\n scene: WebRenderV2.scene(snapshot),\r\n mode,\r\n renderParameters: WebRenderV2.renderParameters(snapshot),\r\n tags\r\n };\r\n return await WebRenderV2.fetchHotspotsArray(`${this.server}/Hotspot`, body);\r\n }\r\n}\r\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","import { Maths } from './Maths';\r\nimport { WebRenderV1 } from './WebRenderV1';\r\nimport { WebRenderV2 } from './WebRenderV2';\r\nexport class Loader {\r\n constructor(server, api, delegate) {\r\n switch (api) {\r\n case 'v1':\r\n this.webrender = new WebRenderV1(server);\r\n break;\r\n case 'v2':\r\n this.webrender = new WebRenderV2(server);\r\n break;\r\n default:\r\n this.webrender = new WebRenderV1(server);\r\n break;\r\n }\r\n this.delegate = delegate;\r\n this.loadingId = 0;\r\n this.loaded = 0;\r\n this.total = 0;\r\n this.onLoadStart = delegate && delegate.onLoadStart ? delegate.onLoadStart : (() => { });\r\n this.onLoadProgress = delegate && delegate.onLoadProgress ? delegate.onLoadProgress : (() => { });\r\n this.onLoadEnd = delegate && delegate.onLoadEnd ? delegate.onLoadEnd : (() => { });\r\n }\r\n get progress() {\r\n return this.total ? this.loaded / this.total : 0;\r\n }\r\n async loadImageSnapshot(snapshot) {\r\n this.loadingId += 1;\r\n this.loaded = 0;\r\n this.total = 1;\r\n this.onLoadStart(this.progress);\r\n const { loadingId } = this;\r\n return this.webrender.image(snapshot).then(src => (this.loadImage(src, loadingId))).then(img => {\r\n this.onLoadEnd(this.progress);\r\n return img;\r\n });\r\n }\r\n async loadVideoSnapshot(video, snapshot) {\r\n this.loadingId += 1;\r\n this.loaded = 0;\r\n this.total = 1;\r\n this.onLoadStart(this.progress);\r\n const { loadingId } = this;\r\n return this.webrender.video(snapshot).then(src => (this.loadVideo(video, src, !!snapshot.view.loop, loadingId))).then(() => {\r\n this.onLoadEnd(this.progress);\r\n return video;\r\n });\r\n }\r\n async loadVRCubeSnapshot(snapshot) {\r\n this.loadingId += 1;\r\n this.loaded = 0;\r\n this.total = 0;\r\n this.onLoadStart(this.progress);\r\n const { loadingId } = this;\r\n return this.webrender.vrCube(snapshot).then(srcs => {\r\n this.total = srcs.length;\r\n const promises = srcs.map(src => this.loadImage(src, loadingId));\r\n return Promise.all(promises);\r\n }).then(imgs => {\r\n this.onLoadEnd(this.progress);\r\n return imgs;\r\n });\r\n }\r\n async loadVRObjectSnapshot(snapshot, position) {\r\n var _a;\r\n this.loadingId += 1;\r\n this.loaded = 0;\r\n this.total = 0;\r\n this.onLoadStart(this.progress);\r\n const { loadingId } = this;\r\n if (snapshot.view.animation) {\r\n if (((_a = snapshot.encoder) === null || _a === void 0 ? void 0 : _a.format) === 'mp4') {\r\n return this.webrender.video(snapshot).then(src => {\r\n return this.loadVideoFrames(src, snapshot.view.frames, 30, loadingId);\r\n });\r\n }\r\n else {\r\n return this.webrender.animation(snapshot).then(srcs => {\r\n return this.loadImageFrames(srcs, snapshot.view.loop, position, loadingId);\r\n });\r\n }\r\n }\r\n else {\r\n return this.webrender.vrObject(snapshot).then(srcs => {\r\n return this.loadImageFrames(srcs, snapshot.view.loop, position, loadingId);\r\n });\r\n }\r\n }\r\n async loadImage(src, loadingId) {\r\n const image = new Image();\r\n image.crossOrigin = 'anonymous';\r\n const promise = new Promise((resolve, reject) => {\r\n image.addEventListener('load', () => {\r\n if (loadingId !== this.loadingId)\r\n return;\r\n this.loaded += 1;\r\n this.onLoadProgress(this.progress);\r\n resolve(image);\r\n }, { once: true });\r\n image.addEventListener('error', (e) => {\r\n if (loadingId !== this.loadingId)\r\n return;\r\n reject(`${e.type} : ${src}`);\r\n }, { once: true });\r\n });\r\n image.src = src;\r\n return promise;\r\n }\r\n loadImageFrames(srcs, loop, position, loadingId) {\r\n this.total = srcs.length;\r\n const promises = new Array(srcs.length);\r\n const start = position || 0;\r\n for (let i = 0, n = srcs.length; i < n; i += 1) {\r\n const step = Math.ceil(i / 2) * (i % 2 === 0 ? 1 : -1);\r\n const index = loop ? Maths.mod(start + step, n) : i;\r\n promises[index] = this.loadImage(srcs[index], loadingId);\r\n }\r\n Promise.all(promises).then(() => this.onLoadEnd(this.progress)).catch(() => { });\r\n return promises;\r\n }\r\n async loadVideo(video, src, loop, loadingId) {\r\n video.loop = loop;\r\n const promise = new Promise((resolve, reject) => {\r\n video.addEventListener('canplaythrough', () => {\r\n if (loadingId !== this.loadingId)\r\n return;\r\n this.loaded += 1;\r\n this.onLoadProgress(this.progress);\r\n resolve();\r\n }, { once: true });\r\n video.addEventListener('error', e => {\r\n if (loadingId !== this.loadingId)\r\n return;\r\n reject(`${e.type} : ${src}`);\r\n }, { once: true });\r\n });\r\n video.src = src;\r\n video.load();\r\n return promise;\r\n }\r\n async loadVideoFrame(video, fps, frames, i, loadingId) {\r\n let count = 0;\r\n return new Promise((resolve, reject) => {\r\n const seeked = () => {\r\n if (loadingId !== this.loadingId)\r\n return;\r\n if (count !== i) {\r\n count += 1;\r\n return;\r\n }\r\n video.removeEventListener('seeked', seeked);\r\n const canvas = document.createElement('canvas');\r\n canvas.width = video.videoWidth;\r\n canvas.height = video.videoHeight;\r\n const context = canvas.getContext('2d');\r\n context.drawImage(video, 0, 0);\r\n const image = new Image();\r\n image.src = canvas.toDataURL();\r\n resolve(image);\r\n this.loaded += 1;\r\n this.onLoadProgress(this.progress);\r\n if (i !== frames - 1) {\r\n video.currentTime += 1 / fps;\r\n }\r\n };\r\n video.addEventListener('seeked', seeked);\r\n video.addEventListener('error', e => {\r\n if (loadingId !== this.loadingId)\r\n return;\r\n reject(e);\r\n }, { once: true });\r\n });\r\n }\r\n loadVideoFrames(src, frames, fps, loadingId) {\r\n this.total = frames;\r\n const promises = new Array(frames);\r\n const video = document.createElement('video');\r\n for (let i = 0, n = frames; i < n; i += 1) {\r\n promises[i] = this.loadVideoFrame(video, fps, frames, i, loadingId);\r\n }\r\n video.addEventListener('canplaythrough', () => {\r\n if (loadingId !== this.loadingId)\r\n return;\r\n video.currentTime = (1 / fps) / 2;\r\n }, { once: true });\r\n video.src = src;\r\n video.load();\r\n Promise.all(promises).then(() => this.onLoadEnd(this.progress)).catch(() => { });\r\n return promises;\r\n }\r\n async loadImageHotspots(snapshot, tags) {\r\n if (!(this.webrender instanceof WebRenderV2)) {\r\n return Promise.reject(new Error('Hotspots only available with api V2'));\r\n }\r\n return await this.webrender.imageHotspots(snapshot, tags);\r\n }\r\n async loadVRCubeHotspots(snapshot, tags) {\r\n if (!(this.webrender instanceof WebRenderV2)) {\r\n return Promise.reject(new Error('Hotspots only available with api V2'));\r\n }\r\n return await this.webrender.vrCubeHotspots(snapshot, tags);\r\n }\r\n async loadVRObjectHotspots(snapshot, tags) {\r\n if (!(this.webrender instanceof WebRenderV2)) {\r\n return Promise.reject(new Error('Hotspots only available with api V2'));\r\n }\r\n return await this.webrender.vrObjectHotspots(snapshot, tags);\r\n }\r\n onLoadStart(progress) {\r\n if (this.delegate) {\r\n this.delegate.onLoadStart(progress);\r\n }\r\n }\r\n onLoadProgress(progress) {\r\n if (this.delegate) {\r\n this.delegate.onLoadProgress(progress);\r\n }\r\n }\r\n onLoadEnd(progress) {\r\n if (this.delegate) {\r\n this.delegate.onLoadEnd(progress);\r\n }\r\n }\r\n}\r\n","import { Resolution } from './Resolution';\r\nimport { Viewport } from './Viewport';\r\nexport class Video {\r\n constructor() {\r\n this.element = document.createElement('video');\r\n this.element.classList.add('ls-viewer-video');\r\n this.element.style.opacity = '0';\r\n this.element.setAttribute('muted', '');\r\n this.element.setAttribute('playsinline', '');\r\n this.element.setAttribute('preload', 'auto');\r\n }\r\n show() {\r\n this.element.style.opacity = '1';\r\n }\r\n hide() {\r\n this.element.style.opacity = '0';\r\n }\r\n resize(width, height, resolution, fit) {\r\n const viewport = Viewport.fit(resolution, new Resolution(width, height), fit);\r\n this.element.style.top = `${viewport.top}px`;\r\n this.element.style.left = `${viewport.left}px`;\r\n this.element.style.width = `${viewport.width}px`;\r\n this.element.style.height = `${viewport.height}px`;\r\n if (resolution.width !== this.element.width || resolution.height !== this.element.height) {\r\n this.element.width = resolution.width;\r\n this.element.height = resolution.height;\r\n }\r\n }\r\n}\r\n","export class WidgetImage {\r\n constructor(container, canvas, loader) {\r\n this.container = container;\r\n this.canvas = canvas;\r\n this.loader = loader;\r\n this.hotspots = [];\r\n }\r\n destroy() { }\r\n show() {\r\n this.canvas.show(false);\r\n this.container.classList.add('ls-viewer-container-image');\r\n }\r\n hide() {\r\n this.canvas.hide(false);\r\n this.container.classList.remove('ls-viewer-container-image');\r\n }\r\n async goto(position) {\r\n return Promise.resolve();\r\n }\r\n async load(snapshot, tags, reset, fade) {\r\n let promise = Promise.resolve();\r\n const snapshotHash = JSON.stringify(snapshot);\r\n if (snapshotHash === this.snapshotHash && this.image) {\r\n promise = promise.then(() => this.canvas.draw(this.image, fade, 0.05));\r\n }\r\n else {\r\n promise = promise.then(() => this.loader.loadImageSnapshot(snapshot).then(image => {\r\n this.canvas.draw(image, fade, 0.05);\r\n this.image = image;\r\n }));\r\n }\r\n const tagsHash = JSON.stringify(tags);\r\n if (tags.length && (snapshotHash !== this.snapshotHash || tagsHash !== this.tagsHash)) {\r\n promise = promise.then(() => this.loader.loadImageHotspots(snapshot, tags).then(hotspots => {\r\n this.hotspots = hotspots;\r\n }));\r\n }\r\n this.snapshotHash = snapshotHash;\r\n this.tagsHash = tagsHash;\r\n return promise.then(() => Promise.resolve(this.hotspots));\r\n }\r\n snapshot(type, quality) {\r\n return this.canvas.element.toDataURL(type, quality);\r\n }\r\n onMouseDown(e) {\r\n }\r\n onMouseMove(e) {\r\n }\r\n onMouseUp(e) {\r\n }\r\n onMouseEnter(e) {\r\n }\r\n onTouchStart(e) {\r\n }\r\n onTouchMove(e) {\r\n }\r\n onTouchEnd(e) {\r\n }\r\n onDeviceOrientation(e) {\r\n }\r\n}\r\n","export class WidgetVideo {\r\n constructor(container, video, loader) {\r\n this.container = container;\r\n this.loader = loader;\r\n this.video = video;\r\n }\r\n destroy() { }\r\n show() {\r\n this.video.show();\r\n this.container.classList.add('ls-viewer-container-video');\r\n }\r\n hide() {\r\n this.video.hide();\r\n this.container.classList.remove('ls-viewer-container-video');\r\n }\r\n async goto(position) {\r\n return Promise.resolve();\r\n }\r\n async load(snapshot) {\r\n const hash = JSON.stringify(snapshot);\r\n if (hash === this.hash) {\r\n this.video.element.load();\r\n return Promise.resolve([]);\r\n }\r\n this.hash = hash;\r\n return this.loader.loadVideoSnapshot(this.video.element, snapshot).then(() => Promise.resolve([]));\r\n }\r\n snapshot(type, quality) {\r\n return 'data:image/gif;base64,R0lGODlhAQABAIAAAP7//wAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==';\r\n }\r\n async play() {\r\n return new Promise((resolve, reject) => {\r\n this.video.element.addEventListener('ended', () => {\r\n resolve();\r\n }, { once: true });\r\n const promise = this.video.element.play();\r\n if (promise) {\r\n promise.catch(() => {\r\n reject();\r\n });\r\n }\r\n this.show();\r\n });\r\n }\r\n onMouseDown(e) {\r\n }\r\n onMouseMove(e) {\r\n }\r\n onMouseUp(e) {\r\n }\r\n onMouseEnter(e) {\r\n }\r\n onTouchStart(e) {\r\n }\r\n onTouchMove(e) {\r\n }\r\n onTouchEnd(e) {\r\n }\r\n onDeviceOrientation(e) {\r\n }\r\n}\r\n","export class Point {\r\n constructor(x, y) {\r\n this.x = x;\r\n this.y = y;\r\n }\r\n clone() {\r\n return new Point(this.x, this.y);\r\n }\r\n}\r\n","import { Point } from './Point';\r\nexport class EventHelper {\r\n static pointFromMouseEvent(e) {\r\n return new Point(e.screenX, e.screenY);\r\n }\r\n static pointFromTouchEvent(e) {\r\n const touch = e.targetTouches[0] || e.changedTouches[0];\r\n return new Point(touch.screenX, touch.screenY);\r\n }\r\n}\r\n","import { m4, v3 } from 'twgl.js';\r\nexport class Basis3 {\r\n constructor(...args) {\r\n if (args.length === 3) {\r\n ({ 0: this.u, 1: this.v, 2: this.o } = args);\r\n this.w = v3.cross(this.u, this.v);\r\n }\r\n else if (args.length === 4) {\r\n ({ 0: this.u, 1: this.v, 2: this.w, 3: this.o } = args);\r\n }\r\n else {\r\n this.u = [1, 0, 0];\r\n this.v = [0, 1, 0];\r\n this.w = [0, 0, 1];\r\n this.o = [0, 0, 0];\r\n }\r\n }\r\n get localToGlobalMatrix() {\r\n const X = [this.u[0], this.u[1], this.u[2], 0.0];\r\n const Y = [this.v[0], this.v[1], this.v[2], 0.0];\r\n const Z = [this.w[0], this.w[1], this.w[2], 0.0];\r\n const W = [this.o[0], this.o[1], this.o[2], 1.0];\r\n return [...X, ...Y, ...Z, ...W];\r\n }\r\n get globalToLocalMatrix() {\r\n return m4.inverse(this.localToGlobalMatrix);\r\n }\r\n}\r\n","export class InertiaPoint {\r\n constructor(x, y, time) {\r\n this.x = x;\r\n this.y = y;\r\n this.time = time;\r\n }\r\n}\r\n","import { InertiaPoint } from './InertiaPoint';\r\nimport { Point } from './Point';\r\nexport class Inertia {\r\n constructor(onMotion) {\r\n this.points = [];\r\n this.onMotion = onMotion;\r\n this.lastPoint = new Point(0.0, 0.0);\r\n this.velocity = new Point(0.0, 0.0);\r\n this.loop = this.loop.bind(this);\r\n }\r\n destroy() {\r\n if (this.animationFrameId) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = undefined;\r\n }\r\n }\r\n track(point) {\r\n const time = Date.now();\r\n this.points = this.points.filter(p => time - p.time <= 100);\r\n this.points.push(new InertiaPoint(point.x, point.y, time));\r\n this.lastPoint = point;\r\n }\r\n start() {\r\n if (this.points.length === 0) {\r\n return;\r\n }\r\n const firstPoint = this.points[0];\r\n const lastPoint = this.points[this.points.length - 1];\r\n const dx = lastPoint.x - firstPoint.x;\r\n const dy = lastPoint.y - firstPoint.y;\r\n const dt = lastPoint.time - firstPoint.time;\r\n this.velocity = new Point(dt === 0 ? 0 : dx / (dt / 15), dt === 0 ? 0 : dy / (dt / 15));\r\n if (this.animationFrameId) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = undefined;\r\n }\r\n this.animationFrameId = requestAnimationFrame(this.loop);\r\n }\r\n stop() {\r\n if (this.animationFrameId) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = undefined;\r\n }\r\n this.points = [];\r\n }\r\n loop() {\r\n if ((Math.abs(this.velocity.x) < 1 && Math.abs(this.velocity.y) < 1)) {\r\n this.animationFrameId = undefined;\r\n this.points = [];\r\n return;\r\n }\r\n this.lastPoint.x += this.velocity.x;\r\n this.lastPoint.y += this.velocity.y;\r\n this.velocity.x *= 0.9;\r\n this.velocity.y *= 0.9;\r\n this.onMotion(this.lastPoint.clone());\r\n this.animationFrameId = requestAnimationFrame(this.loop);\r\n }\r\n}\r\n","import { m4, v3 } from 'twgl.js';\r\nexport class PointOfView {\r\n constructor(target, eye, up) {\r\n this.target = v3.copy(target);\r\n this.eye = v3.copy(eye);\r\n this.up = v3.copy(up);\r\n }\r\n get viewVector() {\r\n return v3.subtract(this.target, this.eye);\r\n }\r\n get rightVector() {\r\n return v3.normalize(v3.cross(this.viewVector, this.up));\r\n }\r\n get viewMatrix() {\r\n return m4.inverse(m4.lookAt(this.eye, this.target, this.up));\r\n }\r\n clone() {\r\n return new PointOfView(v3.copy(this.target), v3.copy(this.eye), v3.copy(this.up));\r\n }\r\n}\r\nPointOfView.default = new PointOfView([0.0, 0.0, 0.0], [2.0, 2.0, 2.0], [0.0, 1.0, 0.0]);\r\n","import { m4, v3 } from 'twgl.js';\r\nimport { Basis3 } from './Basis3';\r\nimport { Inertia } from './Inertia';\r\nimport { Maths } from './Maths';\r\nimport { Point } from './Point';\r\nimport { PointOfView } from './PointOfView';\r\nexport class InteractiveCamera {\r\n constructor(pov, fov, onMotion) {\r\n this.isStarted = false;\r\n this.pov = pov;\r\n this.fov = Maths.degreesToRadians(fov);\r\n this.orientationMatrix = m4.identity();\r\n this.inertia = new Inertia(this.motion.bind(this));\r\n this.onMotion = onMotion;\r\n this.initPov = this.pov;\r\n this.initFov = this.fov;\r\n this.initOrientation = Maths.degreesToRadians(window.orientation) || 0;\r\n this.startPov = new PointOfView([0.0, 0.0, 1.0], [0.0, 0.0, 0.0], [0.0, 1.0, 0.0]);\r\n this.startSize = { width: 0.0, height: 0.0 };\r\n this.previousPoint = new Point(0.0, 0.0);\r\n }\r\n destroy() {\r\n this.inertia.destroy();\r\n }\r\n get orientedPov() {\r\n const viewVector = v3.normalize(v3.cross(this.pov.up, this.pov.target));\r\n const headBasis = new Basis3(viewVector, [0.0, 1.0, 0.0], this.pov.eye);\r\n const matrix = m4.identity();\r\n m4.multiply(matrix, headBasis.localToGlobalMatrix, matrix);\r\n m4.multiply(matrix, this.orientationMatrix, matrix);\r\n m4.multiply(matrix, headBasis.globalToLocalMatrix, matrix);\r\n const target = m4.transformDirection(matrix, this.pov.target);\r\n const eye = this.pov.eye;\r\n const up = m4.transformDirection(matrix, this.pov.up);\r\n return new PointOfView(target, eye, up);\r\n }\r\n reset() {\r\n this.pov = this.initPov.clone();\r\n this.fov = this.initFov;\r\n }\r\n start(point, size) {\r\n this.isStarted = true;\r\n this.startPov = this.pov;\r\n this.startSize = size;\r\n this.previousPoint = point;\r\n this.inertia.stop();\r\n }\r\n motion(point) {\r\n if (this.isStarted) {\r\n this.inertia.track(point);\r\n }\r\n const delta = {\r\n x: point.x - this.previousPoint.x,\r\n y: point.y - this.previousPoint.y,\r\n };\r\n const dx = (Maths.accelerate(delta.x, 1.3) / this.startSize.width) * 0.2 * Math.PI * 1.5;\r\n const dy = (Maths.accelerate(delta.y, 1.3) / this.startSize.height) * 0.2 * Math.PI;\r\n const rotationMatrix = m4.multiply(m4.rotationY(-dx), m4.rotationX(-dy));\r\n const viewVector = v3.normalize(v3.cross(this.pov.up, this.pov.target));\r\n const headBasis = new Basis3(viewVector, [0.0, 1.0, 0.0], this.pov.eye);\r\n const headMatrix = m4.identity();\r\n m4.multiply(headMatrix, headBasis.localToGlobalMatrix, headMatrix);\r\n m4.multiply(headMatrix, rotationMatrix, headMatrix);\r\n m4.multiply(headMatrix, headBasis.globalToLocalMatrix, headMatrix);\r\n const target = m4.transformPoint(headMatrix, this.pov.target);\r\n const up = m4.transformDirection(headMatrix, this.pov.up);\r\n if (v3.cross(up, [0, 0, 1])[0] >= 0) {\r\n this.pov.target = target;\r\n this.pov.up = up;\r\n }\r\n this.previousPoint = point;\r\n this.onMotion();\r\n }\r\n end(point, inertia) {\r\n this.isStarted = false;\r\n if (inertia) {\r\n this.inertia.track(point);\r\n this.inertia.start();\r\n }\r\n }\r\n orientation(alpha, beta, gamma) {\r\n const orientation = Maths.degreesToRadians(window.orientation) || 0;\r\n const alphaRadians = Maths.degreesToRadians(alpha);\r\n const betaRadians = Maths.degreesToRadians(-beta);\r\n const gammaRadians = Maths.degreesToRadians(-gamma);\r\n const matrix = m4.rotationX(Maths.degreesToRadians(90));\r\n m4.rotateZ(matrix, this.initOrientation, matrix);\r\n m4.rotateZ(matrix, alphaRadians, matrix);\r\n m4.rotateX(matrix, betaRadians, matrix);\r\n m4.rotateY(matrix, gammaRadians, matrix);\r\n m4.rotateZ(matrix, -orientation, matrix);\r\n this.orientationMatrix = matrix;\r\n this.onMotion();\r\n }\r\n}\r\n","import * as twgl from 'twgl.js';\r\nimport { m4, v3 } from 'twgl.js';\r\nimport { EventHelper } from './EventHelper';\r\nimport { InteractiveCamera } from './InteractiveCamera';\r\nimport { Maths } from './Maths';\r\nimport { PointOfView } from './PointOfView';\r\nimport { Viewport } from './Viewport';\r\nimport WidgetVRCubeFragmentShader from './WidgetVRCube.frag';\r\nimport WidgetVRCubeVertexShader from './WidgetVRCube.vert';\r\nexport class WidgetVRCube {\r\n constructor(container, canvas, loader, onInteraction) {\r\n this.container = container;\r\n this.canvas = canvas;\r\n this.loader = loader;\r\n this.images = [];\r\n this.hotspotsList = [[]];\r\n const pov = new PointOfView([0.0, 0.0, 1.0], [0.0, 0.0, 0.0], [0.0, 1.0, 0.0]);\r\n const fov = 60;\r\n const rotationMatrix = m4.rotationX(Maths.degreesToRadians(15));\r\n m4.transformDirection(rotationMatrix, pov.target, pov.target);\r\n m4.transformDirection(rotationMatrix, pov.up, pov.up);\r\n this.interaction = new InteractiveCamera(pov, fov, () => {\r\n this.animationFrameId = requestAnimationFrame(this.render);\r\n this.onInteraction({\r\n pov: this.interaction.pov.clone(),\r\n fov: this.interaction.fov\r\n });\r\n });\r\n this.onInteraction = onInteraction;\r\n this.gl = this.canvas.context;\r\n this.programInfo = twgl.createProgramInfo(this.gl, [`${WidgetVRCubeVertexShader}\\n`, `${WidgetVRCubeFragmentShader}\\n`]);\r\n this.quad = twgl.primitives.createXYQuadBufferInfo(this.gl);\r\n this.uniforms = {\r\n u_matrix: m4.identity(),\r\n u_mix: 0.0,\r\n u_texture_back: twgl.createTexture(this.gl, {\r\n target: this.gl.TEXTURE_CUBE_MAP,\r\n minMag: this.gl.LINEAR,\r\n width: 1,\r\n height: 1,\r\n }),\r\n u_texture: twgl.createTexture(this.gl, {\r\n target: this.gl.TEXTURE_CUBE_MAP,\r\n minMag: this.gl.LINEAR,\r\n width: 1,\r\n height: 1,\r\n }),\r\n };\r\n this.render = this.render.bind(this);\r\n }\r\n destroy() {\r\n this.interaction.destroy();\r\n if (this.animationFrameId) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = undefined;\r\n }\r\n }\r\n show() {\r\n this.canvas.show();\r\n this.container.classList.add('ls-viewer-container-vrcube');\r\n }\r\n hide() {\r\n this.canvas.hide();\r\n this.container.classList.remove('ls-viewer-container-vrcube');\r\n }\r\n async goto(position) {\r\n return Promise.resolve();\r\n }\r\n get pov() {\r\n return this.interaction.pov;\r\n }\r\n set pov(pov) {\r\n if (this.interaction.pov.eye.every((v, i) => v === pov.eye[i])\r\n && this.interaction.pov.target.every((v, i) => v === pov.target[i])\r\n && this.interaction.pov.up.every((v, i) => v === pov.up[i])) {\r\n return;\r\n }\r\n this.interaction.pov = pov.clone();\r\n this.animationFrameId = requestAnimationFrame(this.render);\r\n }\r\n get fov() {\r\n return Maths.radiansToDegrees(this.interaction.fov);\r\n }\r\n set fov(fov) {\r\n if (this.interaction.fov === fov) {\r\n return;\r\n }\r\n this.interaction.fov = Maths.degreesToRadians(fov);\r\n this.animationFrameId = requestAnimationFrame(this.render);\r\n }\r\n get hotspots() {\r\n const result = [];\r\n this.hotspotsList.flat();\r\n const width = this.canvas.element.clientWidth;\r\n const height = this.canvas.element.clientHeight;\r\n const modelViewProjectionMatrix = m4.inverse(this.modelViewProjectionMatrix);\r\n this.hotspotsList.forEach((hotspots, i) => {\r\n hotspots.forEach(hotspot => {\r\n const s = hotspot.position2D.x / this.images[0].width;\r\n const t = hotspot.position2D.y / this.images[0].height;\r\n let rx = 0;\r\n let ry = 0;\r\n let rz = 0;\r\n switch (i) {\r\n case 0:\r\n if (this.pov.target[2] < 0) {\r\n return;\r\n }\r\n rx = (2 * s - 1);\r\n ry = (2 * t - 1) * -1;\r\n rz = 1;\r\n break;\r\n case 1:\r\n if (this.pov.target[0] < 0) {\r\n return;\r\n }\r\n rx = 1;\r\n ry = (2 * t - 1) * -1;\r\n rz = (1 - 2 * s);\r\n break;\r\n case 2:\r\n if (this.pov.target[2] > 0) {\r\n return;\r\n }\r\n rx = (1 - 2 * s);\r\n ry = (2 * t - 1) * -1;\r\n rz = -1;\r\n break;\r\n case 3:\r\n if (this.pov.target[0] > 0) {\r\n return;\r\n }\r\n rx = -1;\r\n ry = (2 * t - 1) * -1;\r\n rz = (2 * s - 1);\r\n break;\r\n case 4:\r\n if (this.pov.target[1] < 0) {\r\n return;\r\n }\r\n rx = (2 * s - 1);\r\n ry = 1;\r\n rz = (2 * t - 1);\r\n break;\r\n case 5:\r\n if (this.pov.target[1] > 0) {\r\n return;\r\n }\r\n rx = (2 * s - 1);\r\n ry = -1;\r\n rz = (2 * t - 1) * -1;\r\n break;\r\n }\r\n const point3D = v3.normalize([rx, ry, rz]);\r\n const point2D = m4.transformPoint(modelViewProjectionMatrix, point3D);\r\n const position2D = {\r\n x: width - 0.5 * width * (point2D[0] + 1),\r\n y: height - 0.5 * height * (point2D[1] + 1)\r\n };\r\n result.push(Object.assign(Object.assign({}, hotspot), { position2D }));\r\n });\r\n });\r\n return result;\r\n }\r\n async load(snapshot, tags, reset, fade) {\r\n let promise = Promise.resolve();\r\n const snapshotHash = JSON.stringify(snapshot);\r\n if (snapshotHash === this.snapshotHash) {\r\n promise = promise.then(() => Promise.resolve());\r\n }\r\n else {\r\n this.images = [];\r\n this.animationFrameId = requestAnimationFrame(this.render);\r\n promise = promise.then(() => this.loader.loadVRCubeSnapshot(snapshot).then(images => {\r\n this.images = images;\r\n twgl.createTexture(this.gl, {\r\n target: this.gl.TEXTURE_CUBE_MAP,\r\n minMag: this.gl.LINEAR,\r\n auto: false,\r\n cubeFaceOrder: [\r\n this.gl.TEXTURE_CUBE_MAP_POSITIVE_Z,\r\n this.gl.TEXTURE_CUBE_MAP_POSITIVE_X,\r\n this.gl.TEXTURE_CUBE_MAP_NEGATIVE_Z,\r\n this.gl.TEXTURE_CUBE_MAP_NEGATIVE_X,\r\n this.gl.TEXTURE_CUBE_MAP_POSITIVE_Y,\r\n this.gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,\r\n ],\r\n src: images,\r\n }, (err, texture) => {\r\n if (err) {\r\n return;\r\n }\r\n if (reset) {\r\n this.interaction.reset();\r\n }\r\n this.uniforms.u_mix = fade ? 0.0 : 1.0;\r\n this.uniforms.u_texture_back = this.uniforms.u_texture;\r\n this.uniforms.u_texture = texture;\r\n this.animationFrameId = requestAnimationFrame(this.render);\r\n });\r\n }));\r\n }\r\n const tagsHash = JSON.stringify(tags);\r\n if (tags.length && (snapshotHash !== this.snapshotHash || tagsHash !== this.tagsHash)) {\r\n promise = promise.then(() => this.loader.loadVRCubeHotspots(snapshot, tags).then(hotspots => {\r\n this.hotspotsList = hotspots;\r\n }));\r\n }\r\n this.snapshotHash = snapshotHash;\r\n this.tagsHash = tagsHash;\r\n return promise.then(() => Promise.resolve(this.hotspots));\r\n }\r\n snapshot(type, quality) {\r\n return this.canvas.element.toDataURL(type, quality);\r\n }\r\n get modelViewProjectionMatrix() {\r\n const width = this.canvas.element.clientWidth;\r\n const height = this.canvas.element.clientHeight;\r\n const aspectRatio = Viewport.getStandardAspectRatio(width, height);\r\n const aspect = width / height;\r\n const fov = this.interaction.fov * (aspectRatio / aspect);\r\n const projectionMatrixInverse = m4.inverse(m4.perspective(fov, aspect, 0.5, 100));\r\n const pov = this.interaction.orientedPov;\r\n const viewMatrixInverse = m4.lookAt(pov.eye, pov.target, pov.up);\r\n return m4.multiply(viewMatrixInverse, projectionMatrixInverse);\r\n }\r\n render() {\r\n twgl.resizeCanvasToDisplaySize(this.canvas.element, window.devicePixelRatio);\r\n this.gl.viewport(0, 0, this.gl.canvas.width, this.gl.canvas.height);\r\n this.uniforms.u_matrix = this.modelViewProjectionMatrix;\r\n this.gl.useProgram(this.programInfo.program);\r\n twgl.setBuffersAndAttributes(this.gl, this.programInfo, this.quad);\r\n twgl.setUniforms(this.programInfo, this.uniforms);\r\n twgl.drawBufferInfo(this.gl, this.quad);\r\n if (this.uniforms.u_mix < 1.0) {\r\n this.uniforms.u_mix = Math.min(this.uniforms.u_mix + 0.05, 1.0);\r\n this.animationFrameId = requestAnimationFrame(this.render);\r\n }\r\n }\r\n onMouseDown(e) {\r\n this.container.classList.add('ls-viewer-container-vrcube-grabbing');\r\n this.interaction.start(EventHelper.pointFromMouseEvent(e), {\r\n width: this.gl.canvas.width,\r\n height: this.gl.canvas.height,\r\n });\r\n }\r\n onMouseMove(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n this.interaction.motion(EventHelper.pointFromMouseEvent(e));\r\n e.preventDefault();\r\n }\r\n onMouseUp(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n this.container.classList.remove('ls-viewer-container-vrcube-grabbing');\r\n this.interaction.end(EventHelper.pointFromMouseEvent(e), true);\r\n }\r\n onMouseEnter(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n if (e.buttons === 0) {\r\n this.container.classList.remove('ls-viewer-container-vrcube-grabbing');\r\n this.interaction.end(EventHelper.pointFromMouseEvent(e), false);\r\n }\r\n }\r\n onTouchStart(e) {\r\n this.container.classList.add('ls-viewer-container-vrcube-grabbing');\r\n this.interaction.start(EventHelper.pointFromTouchEvent(e), {\r\n width: this.gl.canvas.width,\r\n height: this.gl.canvas.height,\r\n });\r\n }\r\n onTouchMove(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n this.interaction.motion(EventHelper.pointFromTouchEvent(e));\r\n e.preventDefault();\r\n }\r\n onTouchEnd(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n this.container.classList.remove('ls-viewer-container-vrcube-grabbing');\r\n this.interaction.end(EventHelper.pointFromTouchEvent(e), true);\r\n }\r\n onDeviceOrientation(e) {\r\n this.interaction.orientation(e.alpha, e.beta, e.gamma);\r\n }\r\n}\r\n","import { Inertia } from './Inertia';\r\nimport { Maths } from './Maths';\r\nimport { Point } from './Point';\r\nexport class InteractivePosition {\r\n constructor(position, count, loop, onMotion) {\r\n this.isStarted = false;\r\n this.position = position;\r\n this.count = count;\r\n this.loop = loop;\r\n this.onMotion = onMotion;\r\n this.inertia = new Inertia(this.motion.bind(this));\r\n this.initPosition = this.position;\r\n this.startPosition = 0;\r\n this.startPoint = new Point(0.0, 0.0);\r\n this.startSize = { width: 0.0, height: 0.0 };\r\n }\r\n destroy() {\r\n this.inertia.destroy();\r\n }\r\n reset() {\r\n this.position = this.initPosition;\r\n }\r\n start(point, size) {\r\n this.isStarted = true;\r\n this.startPosition = this.position;\r\n this.startPoint = point;\r\n this.startSize = size;\r\n this.inertia.stop();\r\n }\r\n motion(point) {\r\n if (this.isStarted) {\r\n this.inertia.track(point);\r\n }\r\n const delta = {\r\n x: point.x - this.startPoint.x,\r\n y: point.y - this.startPoint.y,\r\n };\r\n const dx = (Maths.accelerate(delta.x, 1.3) / this.startSize.width) * (this.count / 4);\r\n let position = this.startPosition - Math.round(dx);\r\n if (this.loop) {\r\n position = Maths.mod(position, this.count);\r\n }\r\n else {\r\n position = Math.max(0, Math.min(position, this.count - 1));\r\n }\r\n if (position !== this.position) {\r\n this.position = position;\r\n this.onMotion();\r\n }\r\n }\r\n end(point, inertia) {\r\n this.isStarted = false;\r\n if (inertia) {\r\n this.inertia.track(point);\r\n this.inertia.start();\r\n }\r\n }\r\n}\r\n","import { EventHelper } from './EventHelper';\r\nimport { InteractivePosition } from './InteractivePosition';\r\nimport { Maths } from './Maths';\r\nexport class WidgetVRObject {\r\n constructor(container, canvas, loader, onInteraction) {\r\n this.container = container;\r\n this.canvas = canvas;\r\n this.loader = loader;\r\n this.images = [];\r\n this.hotspotsList = [[]];\r\n this.interaction = new InteractivePosition(0, 1, false, () => {\r\n this.canvas.draw(this.image, true, 0.5);\r\n this.onInteraction({\r\n position: this.interaction.position,\r\n });\r\n });\r\n this.onInteraction = onInteraction;\r\n }\r\n destroy() {\r\n if (this.animationFrameId) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = undefined;\r\n }\r\n }\r\n show() {\r\n this.canvas.show(false);\r\n this.container.classList.add('ls-viewer-container-vrobject');\r\n }\r\n hide() {\r\n this.canvas.hide(false);\r\n this.container.classList.remove('ls-viewer-container-vrobject');\r\n }\r\n async goto(position) {\r\n return new Promise((resolve) => {\r\n let pos = this.interaction.position;\r\n const goToLoop = () => {\r\n if (this.interaction.position === position) {\r\n resolve();\r\n }\r\n else {\r\n let sign = pos > position ? -1 : 1;\r\n if (this.interaction.loop) {\r\n if (((this.interaction.count - pos) + position) < Math.abs(position - pos)) {\r\n sign *= -1;\r\n }\r\n }\r\n pos += 0.5 * sign;\r\n this.position = Math.floor(pos);\r\n this.animationFrameId = requestAnimationFrame(goToLoop);\r\n }\r\n };\r\n this.animationFrameId = requestAnimationFrame(goToLoop);\r\n });\r\n }\r\n set initPosition(position) {\r\n this.interaction.initPosition = position;\r\n }\r\n get position() {\r\n return this.interaction.position;\r\n }\r\n set position(position) {\r\n if (this.interaction.position === position) {\r\n return;\r\n }\r\n if (this.interaction.loop) {\r\n this.interaction.position = Maths.mod(position, this.interaction.count);\r\n }\r\n else {\r\n this.interaction.position = Math.max(0, Math.min(position, this.interaction.count - 1));\r\n }\r\n this.canvas.draw(this.image, true, 0.5);\r\n }\r\n get image() {\r\n return this.images[this.interaction.position];\r\n }\r\n get hotspots() {\r\n return this.hotspotsList[this.interaction.position] || [];\r\n }\r\n async load(snapshot, tags, reset, fade) {\r\n let promise = Promise.resolve();\r\n const { position } = this.interaction;\r\n const snapshotHash = JSON.stringify(snapshot);\r\n if (snapshotHash === this.snapshotHash && this.image) {\r\n promise = promise.then(() => this.canvas.draw(this.image, fade, 0.05));\r\n }\r\n else {\r\n this.images = [];\r\n promise = promise.then(() => this.loader.loadVRObjectSnapshot(snapshot, position).then(promises => {\r\n const frames = promises.length;\r\n this.images = new Array(frames);\r\n this.interaction.count = frames;\r\n this.interaction.loop = !!snapshot.view.loop;\r\n if (reset) {\r\n this.interaction.reset();\r\n }\r\n promises.forEach((promise, i) => {\r\n promise.then((img) => {\r\n this.images[i] = img;\r\n if (img === this.image) {\r\n this.canvas.draw(this.image, fade, 0.05);\r\n }\r\n }).catch(() => { });\r\n });\r\n return promises[this.interaction.position].then(() => Promise.resolve());\r\n }));\r\n }\r\n const tagsHash = JSON.stringify(tags);\r\n if (tags.length && (snapshotHash !== this.snapshotHash || tagsHash !== this.tagsHash)) {\r\n promise = promise.then(() => this.loader.loadVRObjectHotspots(snapshot, tags).then(hotspots => {\r\n this.hotspotsList = hotspots;\r\n }));\r\n }\r\n this.snapshotHash = snapshotHash;\r\n this.tagsHash = tagsHash;\r\n return promise.then(() => Promise.resolve(this.hotspots));\r\n }\r\n snapshot(type, quality) {\r\n return this.canvas.element.toDataURL(type, quality);\r\n }\r\n onMouseDown(e) {\r\n this.container.classList.add('ls-viewer-container-vrobject-grabbing');\r\n this.interaction.start(EventHelper.pointFromMouseEvent(e), {\r\n width: this.canvas.element.width,\r\n height: this.canvas.element.height,\r\n });\r\n }\r\n onMouseMove(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n this.interaction.motion(EventHelper.pointFromMouseEvent(e));\r\n e.preventDefault();\r\n }\r\n onMouseUp(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n this.container.classList.remove('ls-viewer-container-vrobject-grabbing');\r\n this.interaction.end(EventHelper.pointFromMouseEvent(e), true);\r\n }\r\n onMouseEnter(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n if (e.buttons === 0) {\r\n this.container.classList.remove('ls-viewer-container-vrobject-grabbing');\r\n this.interaction.end(EventHelper.pointFromMouseEvent(e), false);\r\n }\r\n }\r\n onTouchStart(e) {\r\n this.container.classList.add('ls-viewer-container-vrobject-grabbing');\r\n this.interaction.start(EventHelper.pointFromTouchEvent(e), {\r\n width: this.canvas.element.width,\r\n height: this.canvas.element.height,\r\n });\r\n }\r\n onTouchMove(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n this.interaction.motion(EventHelper.pointFromTouchEvent(e));\r\n e.preventDefault();\r\n }\r\n onTouchEnd(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n this.container.classList.remove('ls-viewer-container-vrobject-grabbing');\r\n this.interaction.end(EventHelper.pointFromTouchEvent(e), true);\r\n }\r\n onDeviceOrientation(e) {\r\n }\r\n}\r\n","export var WRAPIv2;\r\n(function (WRAPIv2) {\r\n let SunShadowQualityMode;\r\n (function (SunShadowQualityMode) {\r\n SunShadowQualityMode[\"VeryLow\"] = \"veryLow\";\r\n SunShadowQualityMode[\"Low\"] = \"low\";\r\n SunShadowQualityMode[\"Medium\"] = \"medium\";\r\n SunShadowQualityMode[\"Fine\"] = \"fine\";\r\n SunShadowQualityMode[\"Ultra\"] = \"ultra\";\r\n })(SunShadowQualityMode = WRAPIv2.SunShadowQualityMode || (WRAPIv2.SunShadowQualityMode = {}));\r\n let SunShadowSmoothnessMode;\r\n (function (SunShadowSmoothnessMode) {\r\n SunShadowSmoothnessMode[\"None\"] = \"none\";\r\n SunShadowSmoothnessMode[\"Weak\"] = \"weak\";\r\n SunShadowSmoothnessMode[\"Normal\"] = \"normal\";\r\n SunShadowSmoothnessMode[\"Fine\"] = \"fine\";\r\n SunShadowSmoothnessMode[\"UltraFine\"] = \"ultraFine\";\r\n SunShadowSmoothnessMode[\"Max\"] = \"max\";\r\n })(SunShadowSmoothnessMode = WRAPIv2.SunShadowSmoothnessMode || (WRAPIv2.SunShadowSmoothnessMode = {}));\r\n let SunUseCaseMode;\r\n (function (SunUseCaseMode) {\r\n SunUseCaseMode[\"Manual\"] = \"manual\";\r\n SunUseCaseMode[\"ExtractedFromEnv\"] = \"extractedFromEnv\";\r\n })(SunUseCaseMode = WRAPIv2.SunUseCaseMode || (WRAPIv2.SunUseCaseMode = {}));\r\n})(WRAPIv2 || (WRAPIv2 = {}));\r\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import debounce from 'debounce-promise';\r\nimport { Canvas2D } from './Canvas2D';\r\nimport { Canvas3D } from './Canvas3D';\r\nimport { Loader } from './Loader';\r\nimport { Resolution } from './Resolution';\r\nimport { Video } from './Video';\r\nimport { Viewport } from './Viewport';\r\nimport { WidgetImage } from './WidgetImage';\r\nimport { WidgetVideo } from './WidgetVideo';\r\nimport { WidgetVRCube } from './WidgetVRCube';\r\nimport { WidgetVRObject } from './WidgetVRObject';\r\nimport './index.css';\r\nexport class Viewer {\r\n constructor(container, options) {\r\n this.checkResize = this.checkResize.bind(this);\r\n this.onDeviceOrientation = this.onDeviceOrientation.bind(this);\r\n this.onResize = this.onResize.bind(this);\r\n this.onMouseDown = this.onMouseDown.bind(this);\r\n this.onMouseMove = this.onMouseMove.bind(this);\r\n this.onMouseUp = this.onMouseUp.bind(this);\r\n this.onMouseEnter = this.onMouseEnter.bind(this);\r\n this.onTouchStart = this.onTouchStart.bind(this);\r\n this.onTouchMove = this.onTouchMove.bind(this);\r\n this.onTouchEnd = this.onTouchEnd.bind(this);\r\n this.onLoadStart = this.onLoadStart.bind(this);\r\n this.onLoadProgress = this.onLoadProgress.bind(this);\r\n this.onLoadEnd = this.onLoadEnd.bind(this);\r\n this.onLoadError = this.onLoadError.bind(this);\r\n this.onHotspotsChange = this.onHotspotsChange.bind(this);\r\n this.onVrcubeInteraction = this.onVrcubeInteraction.bind(this);\r\n this.onVrobjectInteraction = this.onVrobjectInteraction.bind(this);\r\n this.options = Object.assign({ server: 'localhost', api: 'v1', fit: 'cover', image: {}, video: {}, vrcube: {}, vrobject: {}, events: {} }, options);\r\n this.options.events = Object.assign({ onLoadStart: (() => { }), onLoadProgress: (() => { }), onLoadEnd: (() => { }), onLoadError: (() => { }), onInteraction: (() => { }), onVrcubeInteraction: (() => { }), onVrobjectInteraction: (() => { }), onHotspotsChange: (() => { }) }, options.events);\r\n this.options.events.onLoadError = debounce(this.options.events.onLoadError, 10);\r\n this.container = container;\r\n this.container.classList.add('ls-viewer-container');\r\n this.containerWidth = 0;\r\n this.containerHeight = 0;\r\n this.canvas2D = new Canvas2D();\r\n this.container.appendChild(this.canvas2D.element);\r\n this.canvas3D = new Canvas3D();\r\n this.container.appendChild(this.canvas3D.element);\r\n this.video = new Video();\r\n this.container.appendChild(this.video.element);\r\n this.loader = new Loader(this.options.server, this.options.api, this);\r\n this.resolution = new Resolution(0, 0);\r\n this.parameters = {\r\n width: 0,\r\n height: 0,\r\n antialiasing: false,\r\n superSampling: 2\r\n };\r\n this.encoder = {\r\n format: 'jpeg',\r\n quality: 80,\r\n };\r\n this.widgetImage = new WidgetImage(container, this.canvas2D, this.loader);\r\n this.widgetVideo = new WidgetVideo(container, this.video, this.loader);\r\n this.widgetVRCube = new WidgetVRCube(container, this.canvas3D, this.loader, this.onVrcubeInteraction);\r\n this.widgetVRObject = new WidgetVRObject(container, this.canvas2D, this.loader, this.onVrobjectInteraction);\r\n this.widget = this.widgetImage;\r\n this.isDestroyed = false;\r\n this.container.addEventListener('mousedown', this.onMouseDown);\r\n this.container.addEventListener('mouseenter', this.onMouseEnter);\r\n this.container.addEventListener('touchstart', this.onTouchStart);\r\n document.addEventListener('mousemove', this.onMouseMove, { passive: false });\r\n document.addEventListener('mouseup', this.onMouseUp);\r\n document.addEventListener('touchmove', this.onTouchMove, { passive: false });\r\n document.addEventListener('touchend', this.onTouchEnd);\r\n this.checkResize();\r\n this.loadWidget = debounce(this.loadWidget, 10);\r\n this.onResize = debounce(this.onResize, 250);\r\n }\r\n destroy() {\r\n this.canvas2D.destroy();\r\n this.container.removeEventListener('mousedown', this.onMouseDown);\r\n this.container.removeEventListener('mouseenter', this.onMouseEnter);\r\n this.container.removeEventListener('touchstart', this.onTouchStart);\r\n document.removeEventListener('mousemove', this.onMouseMove);\r\n document.removeEventListener('mouseup', this.onMouseUp);\r\n document.removeEventListener('touchmove', this.onTouchMove);\r\n document.removeEventListener('touchend', this.onTouchEnd);\r\n this.isDestroyed = true;\r\n }\r\n async load(scene, transition) {\r\n let promise = Promise.resolve();\r\n if (transition === null || transition === void 0 ? void 0 : transition.animation) {\r\n promise = promise.then(() => this.loadAnimation(transition.animation));\r\n }\r\n if (this.view && (transition === null || transition === void 0 ? void 0 : transition.fromPosition) !== undefined) {\r\n const mode = this.view.mode;\r\n promise = promise.then(() => this.viewWidget.goto(transition.fromPosition));\r\n }\r\n if (transition === null || transition === void 0 ? void 0 : transition.animation) {\r\n promise = promise.then(() => this.widgetVideo.play());\r\n }\r\n promise = promise.then(() => {\r\n this.scene = Array.isArray(scene) ? [...scene] : [scene];\r\n return this.loadWidget(false, !(transition && transition.animation));\r\n });\r\n promise.catch((e) => {\r\n this.onLoadError(e);\r\n });\r\n return promise;\r\n }\r\n async setEncoder(encoder) {\r\n this.encoder = Object.assign({}, encoder);\r\n let promise = Promise.resolve();\r\n promise = promise.then(() => this.loadWidget(false, true));\r\n promise.catch((e) => {\r\n this.onLoadError(e);\r\n });\r\n return promise;\r\n }\r\n setParameters(parameters) {\r\n this.parameters = Object.assign({}, parameters);\r\n this.parameters.width = this.resolution.width;\r\n this.parameters.height = this.resolution.height;\r\n let promise = Promise.resolve();\r\n promise = promise.then(() => this.loadWidget(false, true));\r\n promise.catch((e) => {\r\n this.onLoadError(e);\r\n });\r\n return promise;\r\n }\r\n setTags(tags) {\r\n this.tags = tags;\r\n this.loadWidget(false, false);\r\n }\r\n async setView(view, transition) {\r\n let promise = Promise.resolve();\r\n if (transition === null || transition === void 0 ? void 0 : transition.animation) {\r\n promise = promise.then(() => this.loadAnimation(transition.animation));\r\n }\r\n if (this.view && (transition === null || transition === void 0 ? void 0 : transition.fromPosition) !== undefined) {\r\n promise = promise.then(() => this.viewWidget.goto(transition.fromPosition));\r\n }\r\n if (transition === null || transition === void 0 ? void 0 : transition.animation) {\r\n promise = promise.then(() => this.widgetVideo.play());\r\n }\r\n promise = promise.then(() => {\r\n let reset = true;\r\n this.view = Object.assign({}, view);\r\n if (this.view && this.viewWidget instanceof WidgetVRObject && (transition === null || transition === void 0 ? void 0 : transition.toPosition) !== undefined) {\r\n reset = false;\r\n this.viewWidget.position = transition.toPosition;\r\n }\r\n return this.loadWidget(reset, !(transition && transition.animation));\r\n });\r\n promise.catch((e) => {\r\n this.onLoadError(e);\r\n });\r\n return promise;\r\n }\r\n setVrcube(data) {\r\n Object.assign(this.widgetVRCube, data);\r\n }\r\n setVrobject(data) {\r\n Object.assign(this.widgetVRObject, data);\r\n }\r\n async loadAnimation(animation) {\r\n var _a;\r\n const snapshot = {\r\n scene: this.scene,\r\n view: {\r\n animation: animation.name,\r\n camera: animation.camera,\r\n duration: animation.duration,\r\n loop: animation.loop,\r\n reverse: animation.reverse,\r\n },\r\n parameters: this.parameters,\r\n encoder: {\r\n format: 'mp4',\r\n },\r\n };\r\n if (!((_a = snapshot.view) === null || _a === void 0 ? void 0 : _a.background)) {\r\n snapshot.view.background = 'product';\r\n }\r\n return this.widgetVideo.load(snapshot).then(() => Promise.resolve());\r\n }\r\n async playAnimation(animation) {\r\n return this.loadAnimation(animation).then(() => this.widgetVideo.play()).catch((e) => {\r\n this.onLoadError(e);\r\n });\r\n }\r\n stopAnimation() {\r\n this.widgetVideo.hide();\r\n }\r\n snapshot(type, quality) {\r\n return this.viewWidget.snapshot(type, quality);\r\n }\r\n async loadWidget(reset, fade) {\r\n if (!this.scene || !this.view) {\r\n return Promise.resolve();\r\n }\r\n if (!this.parameters.width || !this.parameters.height) {\r\n return Promise.resolve();\r\n }\r\n const widget = this.viewWidget;\r\n if (!widget) {\r\n return Promise.reject(new Error('Unknown view mode'));\r\n }\r\n const snapshot = {\r\n scene: this.scene,\r\n view: this.view,\r\n parameters: this.parameters,\r\n encoder: this.encoder\r\n };\r\n if (!snapshot.view.background) {\r\n snapshot.view.background = 'product';\r\n }\r\n return widget.load(snapshot, this.tags || [], reset, fade).then(hotspots => {\r\n this.widget.hide();\r\n this.widget = widget;\r\n this.widget.show();\r\n this.widgetVideo.hide();\r\n this.onHotspotsChange(hotspots);\r\n });\r\n }\r\n get viewWidget() {\r\n var _a;\r\n switch ((_a = this.view) === null || _a === void 0 ? void 0 : _a.mode) {\r\n case 'image':\r\n return this.widgetImage;\r\n case 'video':\r\n return this.widgetVideo;\r\n case 'vrcube':\r\n return this.widgetVRCube;\r\n case 'vrobject':\r\n return this.widgetVRObject;\r\n default:\r\n return this.widgetImage;\r\n }\r\n }\r\n checkResize() {\r\n if (this.isDestroyed) {\r\n return;\r\n }\r\n const width = this.container.clientWidth;\r\n const height = this.container.clientHeight;\r\n if (width !== this.containerWidth || height !== this.containerHeight) {\r\n this.containerWidth = width;\r\n this.containerHeight = height;\r\n this.onResize();\r\n }\r\n if (!this.isDestroyed) {\r\n requestAnimationFrame(this.checkResize);\r\n }\r\n }\r\n onMouseDown(e) {\r\n this.widget.onMouseDown(e);\r\n }\r\n onMouseEnter(e) {\r\n this.widget.onMouseEnter(e);\r\n }\r\n onMouseMove(e) {\r\n this.widget.onMouseMove(e);\r\n }\r\n onMouseUp(e) {\r\n this.widget.onMouseUp(e);\r\n }\r\n onTouchStart(e) {\r\n this.widget.onTouchStart(e);\r\n }\r\n onTouchMove(e) {\r\n this.widget.onTouchMove(e);\r\n }\r\n onTouchEnd(e) {\r\n this.widget.onTouchEnd(e);\r\n }\r\n onDeviceOrientation(e) {\r\n this.widget.onDeviceOrientation(e);\r\n }\r\n onResize() {\r\n const pixelRatio = window.devicePixelRatio;\r\n const width = this.container.clientWidth * pixelRatio;\r\n const height = this.container.clientHeight * pixelRatio;\r\n this.resolution = Viewport.getStandardResolution(width, height);\r\n this.parameters.width = this.resolution.width;\r\n this.parameters.height = this.resolution.height;\r\n this.canvas2D.resize(width / pixelRatio, height / pixelRatio, this.resolution, this.options.fit);\r\n this.canvas3D.resize();\r\n this.video.resize(width / pixelRatio, height / pixelRatio, this.resolution, this.options.fit);\r\n this.loadWidget(false, false).catch(e => {\r\n this.onLoadError(e);\r\n });\r\n }\r\n onVrcubeInteraction(...args) {\r\n this.options.events.onHotspotsChange(this.widgetVRCube.hotspots);\r\n this.options.events.onInteraction(...args);\r\n this.options.events.onVrcubeInteraction(...args);\r\n }\r\n onVrobjectInteraction(...args) {\r\n this.options.events.onHotspotsChange(this.widgetVRObject.hotspots);\r\n this.options.events.onInteraction(...args);\r\n this.options.events.onVrobjectInteraction(...args);\r\n }\r\n onHotspotsChange(...args) {\r\n this.options.events.onHotspotsChange(...args);\r\n }\r\n onLoadStart(...args) {\r\n this.container.classList.add('ls-viewer-container-loading');\r\n this.options.events.onLoadStart(...args);\r\n }\r\n onLoadProgress(...args) {\r\n this.options.events.onLoadProgress(...args);\r\n }\r\n onLoadEnd(...args) {\r\n this.container.classList.remove('ls-viewer-container-loading');\r\n this.options.events.onLoadEnd(...args);\r\n }\r\n onLoadError(...args) {\r\n this.container.classList.remove('ls-viewer-container-loading');\r\n this.options.events.onLoadError(...args);\r\n }\r\n}\r\n"],"names":["Resolution","constructor","width","height","this","aspect","Viewport","top","left","static","resolution","viewportResolution","fit","aspectRatio","viewportRatio","Math","abs","getStandardAspectRatio","quality","getStandardQuality","max","round","Canvas2D","element","document","createElement","classList","add","style","opacity","context","getContext","backCanvas","backContext","destroy","requestAnimationId","cancelAnimationFrame","undefined","show","useDisplay","display","hide","resize","viewport","load","src","image","Image","onload","draw","img","fade","speed","drawImage","globalAlpha","fadeLoop","alpha","min","clearRect","requestAnimationFrame","Canvas3D","twgl","preserveDrawingBuffer","setDefaultTextureColor","Maths","v","f","factor","a","PI","x","y","floor","WebRenderV1","server","request","Object","entries","filter","k","map","join","snapshot","_a","_b","scene","accessory","length","find","p","decor","product","databaseId","database","configuration","animations","accessoryDatabaseId","decorDatabaseId","decorDeltaAltitude","translation","parameters","view","background","softwareAntialiasing","antialiasing","superSampling","encoder","imageFormat","format","imageQuality","url","fetch","then","response","text","responseText","matches","replace","match","xmlRegex","m","Promise","reject","async","assign","sceneParameters","animation","bookmarkSet","camera","split","bookmark","frames","loop","renderParameters","encoderParameters","queryString","buildQuery","resolve","duration","reverse","WebRenderV2","pResult","s","e","t","prototype","hasOwnProperty","call","indexOf","getOwnPropertySymbols","i","propertyIsEnumerable","__rest","toString","jpeg","png","compression","webp","body","method","JSON","stringify","json","data","mode","fetchFrame","vrCube","fetchFrameArray","cameraGroup","images","vrObject","panFrames","panFrom","panTo","panLoop","tiltFrames","tiltFrom","tiltTo","tiltLoop","id","fps","tags","fetchHotspots","fetchHotspotsArray","Loader","api","delegate","webrender","loadingId","loaded","total","onLoadStart","onLoadProgress","onLoadEnd","progress","loadImage","video","loadVideo","srcs","promises","all","imgs","position","loadVideoFrames","loadImageFrames","crossOrigin","promise","addEventListener","once","type","Array","start","n","step","ceil","index","mod","catch","count","seeked","removeEventListener","canvas","videoWidth","videoHeight","toDataURL","currentTime","loadVideoFrame","imageHotspots","Error","vrCubeHotspots","vrObjectHotspots","Video","setAttribute","WidgetImage","container","loader","hotspots","remove","reset","snapshotHash","loadImageSnapshot","tagsHash","loadImageHotspots","onMouseDown","onMouseMove","onMouseUp","onMouseEnter","onTouchStart","onTouchMove","onTouchEnd","onDeviceOrientation","WidgetVideo","hash","loadVideoSnapshot","play","Point","clone","EventHelper","screenX","screenY","touch","targetTouches","changedTouches","Basis3","args","u","o","w","v3","cross","localToGlobalMatrix","globalToLocalMatrix","m4","inverse","InertiaPoint","time","Inertia","onMotion","points","lastPoint","velocity","bind","animationFrameId","track","point","Date","now","push","firstPoint","dx","dy","dt","stop","PointOfView","target","eye","up","copy","viewVector","subtract","rightVector","normalize","viewMatrix","lookAt","default","InteractiveCamera","pov","fov","isStarted","degreesToRadians","orientationMatrix","identity","inertia","motion","initPov","initFov","initOrientation","window","orientation","startPov","startSize","previousPoint","orientedPov","headBasis","matrix","multiply","transformDirection","size","delta","accelerate","rotationMatrix","rotationY","rotationX","headMatrix","transformPoint","end","beta","gamma","alphaRadians","betaRadians","gammaRadians","rotateZ","rotateX","rotateY","WidgetVRCube","onInteraction","hotspotsList","interaction","render","gl","programInfo","createProgramInfo","quad","primitives","createXYQuadBufferInfo","uniforms","u_matrix","u_mix","u_texture_back","createTexture","TEXTURE_CUBE_MAP","minMag","LINEAR","u_texture","every","radiansToDegrees","result","flat","clientWidth","clientHeight","modelViewProjectionMatrix","forEach","hotspot","position2D","rx","ry","rz","point3D","point2D","loadVRCubeSnapshot","auto","cubeFaceOrder","TEXTURE_CUBE_MAP_POSITIVE_Z","TEXTURE_CUBE_MAP_POSITIVE_X","TEXTURE_CUBE_MAP_NEGATIVE_Z","TEXTURE_CUBE_MAP_NEGATIVE_X","TEXTURE_CUBE_MAP_POSITIVE_Y","TEXTURE_CUBE_MAP_NEGATIVE_Y","err","texture","loadVRCubeHotspots","projectionMatrixInverse","perspective","viewMatrixInverse","resizeCanvasToDisplaySize","devicePixelRatio","useProgram","program","setBuffersAndAttributes","setUniforms","drawBufferInfo","pointFromMouseEvent","preventDefault","buttons","pointFromTouchEvent","InteractivePosition","initPosition","startPosition","startPoint","WidgetVRObject","pos","goToLoop","sign","loadVRObjectSnapshot","loadVRObjectHotspots","WRAPIv2","css","ref","insertAt","head","getElementsByTagName","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","Viewer","options","checkResize","onResize","onLoadError","onHotspotsChange","onVrcubeInteraction","onVrobjectInteraction","vrcube","vrobject","events","debounce","containerWidth","containerHeight","canvas2D","canvas3D","widgetImage","widgetVideo","widgetVRCube","widgetVRObject","widget","isDestroyed","passive","loadWidget","transition","loadAnimation","fromPosition","viewWidget","goto","isArray","setParameters","setTags","toPosition","setVrcube","setVrobject","name","stopAnimation","pixelRatio","getStandardResolution","SunShadowQualityMode","SunShadowSmoothnessMode","SunUseCaseMode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/Canvas2D.ts","../src/Canvas3D.ts","../src/Maths.ts","../src/WebRenderStatic.ts","../src/WebRenderV1.ts","../src/WebRenderV2.ts","../node_modules/tslib/tslib.es6.js","../src/Loader.ts","../src/Resolution.ts","../src/Viewport.ts","../src/Video.ts","../src/WidgetImage.ts","../src/WidgetVideo.ts","../src/Point.ts","../src/EventHelper.ts","../src/Basis3.ts","../src/InertiaPoint.ts","../src/Inertia.ts","../src/PointOfView.ts","../src/InteractiveCamera.ts","../src/WidgetVRCube.ts","../src/InteractivePosition.ts","../src/WidgetVRObject.ts","../src/WRAPIv2.ts","../node_modules/style-inject/dist/style-inject.es.js","../src/Viewer.ts"],"sourcesContent":["export class Canvas2D {\r\n constructor(fit) {\r\n this.element = document.createElement('canvas');\r\n this.element.classList.add('ls-viewer-canvas');\r\n this.element.style.opacity = '0';\r\n this.context = this.element.getContext('2d');\r\n this.backCanvas = document.createElement('canvas');\r\n this.backContext = this.backCanvas.getContext('2d');\r\n this.fit = fit;\r\n }\r\n destroy() {\r\n if (this.requestAnimationId) {\r\n cancelAnimationFrame(this.requestAnimationId);\r\n this.requestAnimationId = undefined;\r\n }\r\n }\r\n show(useDisplay) {\r\n if (useDisplay) {\r\n this.element.style.display = 'block';\r\n }\r\n else {\r\n this.element.style.opacity = '1';\r\n }\r\n }\r\n hide(useDisplay) {\r\n if (useDisplay) {\r\n this.element.style.display = 'none';\r\n }\r\n else {\r\n this.element.style.opacity = '0';\r\n }\r\n }\r\n resize(width, height) {\r\n this.element.width = width;\r\n this.element.height = height;\r\n this.backCanvas.width = width;\r\n this.backCanvas.height = height;\r\n }\r\n draw(img, fade, speed) {\r\n if (!img) {\r\n return;\r\n }\r\n if (this.requestAnimationId) {\r\n cancelAnimationFrame(this.requestAnimationId);\r\n this.requestAnimationId = undefined;\r\n }\r\n if (fade) {\r\n this.drawImage(this.backContext, img);\r\n this.context.globalAlpha = 0.0;\r\n this.fadeLoop(img, speed || 0);\r\n }\r\n else {\r\n this.context.globalAlpha = 1.0;\r\n this.drawImage(this.context, img);\r\n }\r\n this.image = img;\r\n }\r\n fadeLoop(img, speed) {\r\n if (this.context.globalAlpha >= 1.0) {\r\n cancelAnimationFrame(this.requestAnimationId);\r\n this.requestAnimationId = undefined;\r\n return;\r\n }\r\n const alpha = Math.min(this.context.globalAlpha + speed, 1.0);\r\n this.context.clearRect(0, 0, this.element.width, this.element.height);\r\n this.context.globalAlpha = 1.0;\r\n this.drawImage(this.context, this.backCanvas);\r\n this.context.globalAlpha = alpha;\r\n this.drawImage(this.context, img);\r\n this.requestAnimationId = requestAnimationFrame(() => {\r\n this.fadeLoop(img, speed);\r\n });\r\n }\r\n drawImage(context, image) {\r\n const aspectRatio = image.width / image.height;\r\n const canvasAspectRatio = this.element.width / this.element.height;\r\n let width = 0;\r\n let height = 0;\r\n switch (this.fit) {\r\n case 'contain':\r\n width = canvasAspectRatio < aspectRatio ? this.element.width : this.element.height * aspectRatio;\r\n height = canvasAspectRatio < aspectRatio ? this.element.width / aspectRatio : this.element.height;\r\n break;\r\n case 'cover':\r\n width = canvasAspectRatio < aspectRatio ? this.element.height * aspectRatio : this.element.width;\r\n height = canvasAspectRatio < aspectRatio ? this.element.height : this.element.width / aspectRatio;\r\n break;\r\n case 'fill':\r\n width = this.element.width;\r\n height = this.element.height;\r\n break;\r\n }\r\n const dx = (this.element.width - width) / 2;\r\n const dy = (this.element.height - height) / 2;\r\n context.drawImage(image, dx, dy, width, height);\r\n }\r\n}\r\n","import * as twgl from 'twgl.js';\r\nexport class Canvas3D {\r\n constructor() {\r\n this.element = document.createElement('canvas');\r\n this.element.classList.add('ls-viewer-canvas');\r\n this.element.style.opacity = '0';\r\n this.context = twgl.getContext(this.element, { preserveDrawingBuffer: true });\r\n twgl.setDefaultTextureColor([1, 1, 1, 1]);\r\n }\r\n show() {\r\n this.element.style.opacity = '1';\r\n }\r\n hide() {\r\n this.element.style.opacity = '0';\r\n }\r\n resize(width, height) {\r\n this.element.width = width;\r\n this.element.height = height;\r\n }\r\n}\r\n","export class Maths {\r\n static accelerate(v, f) {\r\n const factor = f || 1.5;\r\n return (Math.abs(v) ** factor) * (v > 0 ? 1 : -1);\r\n }\r\n static degreesToRadians(a) {\r\n return a * (Math.PI / 180);\r\n }\r\n static radiansToDegrees(a) {\r\n return a * (180 / Math.PI);\r\n }\r\n static mod(x, y) {\r\n return (x - (y * Math.floor(x / y)));\r\n }\r\n}\r\n","export class WebRenderStatic {\r\n constructor() {\r\n }\r\n async animation(snapshot) {\r\n return snapshot.scene;\r\n }\r\n async image(snapshot) {\r\n return snapshot.scene;\r\n }\r\n async video(snapshot) {\r\n return snapshot.scene;\r\n }\r\n async vrCube(snapshot) {\r\n return snapshot.scene;\r\n }\r\n async vrObject(snapshot) {\r\n return snapshot.scene;\r\n }\r\n}\r\n","export class WebRenderV1 {\r\n constructor(server) {\r\n this.server = server;\r\n }\r\n static buildQuery(request) {\r\n return Object.entries(request).filter(([k, v]) => v !== null && v !== undefined).map(([k, v]) => `${k}=${v}`).join('&');\r\n }\r\n static sceneParameters(snapshot) {\r\n var _a, _b;\r\n const scene = snapshot.scene;\r\n const accessory = scene.length > 1 ? scene.find(p => p.accessory) : null;\r\n const decor = scene.length > 1 ? scene.find(p => p.decor) : null;\r\n const product = scene.find(p => p !== accessory && p !== decor);\r\n return {\r\n databaseId: product.database,\r\n configuration: product === null || product === void 0 ? void 0 : product.configuration,\r\n animations: (_a = product === null || product === void 0 ? void 0 : product.animations) === null || _a === void 0 ? void 0 : _a.join('/'),\r\n accessoryDatabaseId: accessory === null || accessory === void 0 ? void 0 : accessory.database,\r\n decorDatabaseId: decor === null || decor === void 0 ? void 0 : decor.database,\r\n decorDeltaAltitude: (_b = decor === null || decor === void 0 ? void 0 : decor.translation) === null || _b === void 0 ? void 0 : _b.y\r\n };\r\n }\r\n static renderParameters(snapshot) {\r\n const { parameters, view } = snapshot;\r\n return {\r\n background: view.background,\r\n width: parameters.width,\r\n height: parameters.height,\r\n softwareAntialiasing: parameters.antialiasing,\r\n superSampling: parameters.superSampling\r\n };\r\n }\r\n static encoderParameters(snapshot) {\r\n const { encoder } = snapshot;\r\n return {\r\n imageFormat: encoder.format,\r\n imageQuality: encoder.quality\r\n };\r\n }\r\n static async fetch(url) {\r\n return fetch(url).then(response => response.text()).then(responseText => {\r\n const xml = responseText.replace(/&/g, '&');\r\n const matches = xml.match(this.xmlRegex);\r\n if (!matches) {\r\n return Promise.reject();\r\n }\r\n return matches.map(m => m.replace(this.xmlRegex, '$1'));\r\n });\r\n }\r\n async animation(snapshot) {\r\n const request = Object.assign(Object.assign(Object.assign(Object.assign({}, WebRenderV1.sceneParameters(snapshot)), { animation: snapshot.view.animation, bookmarkSet: snapshot.view.camera.split('/')[0], bookmark: snapshot.view.camera.split('/')[1], frames: snapshot.view.frames, loop: !!snapshot.view.loop }), WebRenderV1.renderParameters(snapshot)), WebRenderV1.encoderParameters(snapshot));\r\n const queryString = WebRenderV1.buildQuery(request);\r\n return WebRenderV1.fetch(`${this.server}/ImagesFromAnimation?${queryString}`);\r\n }\r\n async image(snapshot) {\r\n const request = Object.assign(Object.assign(Object.assign(Object.assign({}, WebRenderV1.sceneParameters(snapshot)), { bookmarkSet: snapshot.view.camera.split('/')[0], bookmark: snapshot.view.camera.split('/')[1] }), WebRenderV1.renderParameters(snapshot)), WebRenderV1.encoderParameters(snapshot));\r\n const queryString = WebRenderV1.buildQuery(request);\r\n return Promise.resolve(`${this.server}/ImageFromBookmark?${queryString}`);\r\n }\r\n async video(snapshot) {\r\n const request = Object.assign(Object.assign(Object.assign(Object.assign({}, WebRenderV1.sceneParameters(snapshot)), { animation: snapshot.view.animation, bookmarkSet: snapshot.view.camera.split('/')[0], bookmark: snapshot.view.camera.split('/')[1], duration: snapshot.view.duration, frames: snapshot.view.frames, loop: !!snapshot.view.loop, reverse: !!snapshot.view.reverse }), WebRenderV1.renderParameters(snapshot)), WebRenderV1.encoderParameters(snapshot));\r\n const queryString = WebRenderV1.buildQuery(request);\r\n return Promise.resolve(`${this.server}/ImagesFromAnimation?${queryString}`);\r\n }\r\n async vrCube(snapshot) {\r\n const request = Object.assign(Object.assign(Object.assign(Object.assign({}, WebRenderV1.sceneParameters(snapshot)), { bookmarkSet: snapshot.view.camera.split('/')[0], bookmark: snapshot.view.camera.split('/')[1] }), WebRenderV1.renderParameters(snapshot)), WebRenderV1.encoderParameters(snapshot));\r\n request.width = Math.max(request.width, request.height);\r\n request.height = Math.max(request.width, request.height);\r\n const queryString = WebRenderV1.buildQuery(request);\r\n return WebRenderV1.fetch(`${this.server}/CubeFromBookmark?${queryString}`);\r\n }\r\n async vrObject(snapshot) {\r\n const request = Object.assign(Object.assign(Object.assign(Object.assign({}, WebRenderV1.sceneParameters(snapshot)), { bookmarkSet: snapshot.view.camera }), WebRenderV1.renderParameters(snapshot)), WebRenderV1.encoderParameters(snapshot));\r\n const queryString = WebRenderV1.buildQuery(request);\r\n return WebRenderV1.fetch(`${this.server}/ImagesFromBookmarkSet?${queryString}`);\r\n }\r\n}\r\nWebRenderV1.xmlRegex = /directUrl=\"([^\"]*)\"/g;\r\n","import { __rest } from \"tslib\";\r\nexport class WebRenderV2 {\r\n constructor(server) {\r\n this.server = server;\r\n }\r\n static scene(snapshot) {\r\n return snapshot.scene.map(p => {\r\n const { accessory, decor } = p, pResult = __rest(p, [\"accessory\", \"decor\"]);\r\n return pResult;\r\n });\r\n }\r\n static renderParameters(snapshot) {\r\n return Object.assign(Object.assign({}, snapshot.parameters), { superSampling: snapshot.parameters.superSampling.toString() });\r\n }\r\n static encoder(snapshot) {\r\n switch (snapshot.encoder.format) {\r\n case 'jpeg': return {\r\n jpeg: {\r\n quality: snapshot.encoder.quality\r\n }\r\n };\r\n case 'png': return {\r\n png: {\r\n compression: snapshot.encoder.compression\r\n }\r\n };\r\n case 'webp': return {\r\n webp: {\r\n quality: snapshot.encoder.quality\r\n }\r\n };\r\n }\r\n return {\r\n jpeg: {\r\n quality: 80\r\n }\r\n };\r\n }\r\n static async fetchFrame(url, body) {\r\n return fetch(url, { method: 'POST', body: JSON.stringify(body) }).then(response => response.json()).then((data) => {\r\n return data.url;\r\n });\r\n }\r\n static async fetchFrameArray(url, body) {\r\n return fetch(url, { method: 'POST', body: JSON.stringify(body) }).then(response => response.json()).then((data) => {\r\n return data.map(f => f.url);\r\n });\r\n }\r\n static async fetchHotspots(url, body) {\r\n return fetch(url, { method: 'POST', body: JSON.stringify(body) }).then(response => response.json()).then((data) => {\r\n return data;\r\n });\r\n }\r\n static async fetchHotspotsArray(url, body) {\r\n return fetch(url, { method: 'POST', body: JSON.stringify(body) }).then(response => response.json()).then((data) => {\r\n return data;\r\n });\r\n }\r\n async image(snapshot) {\r\n const body = {\r\n scene: WebRenderV2.scene(snapshot),\r\n mode: {\r\n image: {\r\n camera: snapshot.view.camera\r\n }\r\n },\r\n renderParameters: WebRenderV2.renderParameters(snapshot),\r\n encoder: WebRenderV2.encoder(snapshot)\r\n };\r\n return WebRenderV2.fetchFrame(`${this.server}/Snapshot`, body);\r\n }\r\n async vrCube(snapshot) {\r\n const body = {\r\n scene: WebRenderV2.scene(snapshot),\r\n mode: {\r\n vrCube: {\r\n camera: snapshot.view.camera\r\n }\r\n },\r\n renderParameters: WebRenderV2.renderParameters(snapshot),\r\n encoder: WebRenderV2.encoder(snapshot)\r\n };\r\n body.renderParameters.width = Math.max(body.renderParameters.width, body.renderParameters.height);\r\n body.renderParameters.height = Math.max(body.renderParameters.width, body.renderParameters.height);\r\n return WebRenderV2.fetchFrameArray(`${this.server}/Snapshot`, body);\r\n }\r\n async vrObject(snapshot) {\r\n let mode;\r\n if (snapshot.view.cameraGroup) {\r\n mode = {\r\n images: {\r\n cameraGroup: snapshot.view.cameraGroup\r\n }\r\n };\r\n }\r\n else {\r\n if (snapshot.view.frames) {\r\n mode = {\r\n vrObject: {\r\n camera: snapshot.view.camera,\r\n frames: snapshot.view.frames\r\n }\r\n };\r\n }\r\n else {\r\n mode = {\r\n vrObject: {\r\n camera: snapshot.view.camera,\r\n panFrames: snapshot.view.panFrames || 1,\r\n panFrom: snapshot.view.panFrom || 0,\r\n panTo: snapshot.view.panTo || 0,\r\n panLoop: snapshot.view.panLoop || false,\r\n tiltFrames: snapshot.view.tiltFrames || 1,\r\n tiltFrom: snapshot.view.tiltFrom || 0,\r\n tiltTo: snapshot.view.tiltTo || 0,\r\n tiltLoop: snapshot.view.tiltLoop || false\r\n }\r\n };\r\n }\r\n }\r\n const body = {\r\n scene: WebRenderV2.scene(snapshot),\r\n mode,\r\n renderParameters: WebRenderV2.renderParameters(snapshot),\r\n encoder: WebRenderV2.encoder(snapshot)\r\n };\r\n return WebRenderV2.fetchFrameArray(`${this.server}/Snapshot`, body);\r\n }\r\n async animation(snapshot) {\r\n const body = {\r\n scene: WebRenderV2.scene(snapshot),\r\n mode: {\r\n animation: {\r\n id: snapshot.view.animation,\r\n camera: snapshot.view.camera,\r\n fps: snapshot.view.fps,\r\n }\r\n },\r\n renderParameters: WebRenderV2.renderParameters(snapshot),\r\n encoder: WebRenderV2.encoder(snapshot)\r\n };\r\n return WebRenderV2.fetchFrameArray(`${this.server}/Snapshot`, body);\r\n }\r\n async imageHotspots(snapshot, tags) {\r\n const body = {\r\n scene: WebRenderV2.scene(snapshot),\r\n mode: {\r\n image: {\r\n camera: snapshot.view.camera\r\n }\r\n },\r\n renderParameters: WebRenderV2.renderParameters(snapshot),\r\n tags: tags\r\n };\r\n return await WebRenderV2.fetchHotspots(`${this.server}/Hotspot`, body);\r\n }\r\n async vrCubeHotspots(snapshot, tags) {\r\n const body = {\r\n scene: WebRenderV2.scene(snapshot),\r\n mode: {\r\n vrCube: {\r\n camera: snapshot.view.camera\r\n }\r\n },\r\n renderParameters: WebRenderV2.renderParameters(snapshot),\r\n tags\r\n };\r\n body.renderParameters.width = Math.max(body.renderParameters.width, body.renderParameters.height);\r\n body.renderParameters.height = Math.max(body.renderParameters.width, body.renderParameters.height);\r\n return await WebRenderV2.fetchHotspotsArray(`${this.server}/Hotspot`, body);\r\n }\r\n async vrObjectHotspots(snapshot, tags) {\r\n let mode;\r\n if (snapshot.view.cameraGroup) {\r\n mode = {\r\n images: {\r\n cameraGroup: snapshot.view.cameraGroup\r\n }\r\n };\r\n }\r\n else {\r\n if (snapshot.view.frames) {\r\n mode = {\r\n vrObject: {\r\n camera: snapshot.view.camera,\r\n frames: snapshot.view.frames\r\n }\r\n };\r\n }\r\n else {\r\n mode = {\r\n vrObject: {\r\n camera: snapshot.view.camera,\r\n panFrames: snapshot.view.panFrames || 1,\r\n panFrom: snapshot.view.panFrom || 0,\r\n panTo: snapshot.view.panTo || 0,\r\n panLoop: snapshot.view.panLoop || false,\r\n tiltFrames: snapshot.view.tiltFrames || 1,\r\n tiltFrom: snapshot.view.tiltFrom || 0,\r\n tiltTo: snapshot.view.tiltTo || 0,\r\n tiltLoop: snapshot.view.tiltLoop || false\r\n }\r\n };\r\n }\r\n }\r\n const body = {\r\n scene: WebRenderV2.scene(snapshot),\r\n mode,\r\n renderParameters: WebRenderV2.renderParameters(snapshot),\r\n tags\r\n };\r\n return await WebRenderV2.fetchHotspotsArray(`${this.server}/Hotspot`, body);\r\n }\r\n}\r\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","import { Maths } from './Maths';\r\nimport { WebRenderStatic } from './WebRenderStatic';\r\nimport { WebRenderV1 } from './WebRenderV1';\r\nimport { WebRenderV2 } from './WebRenderV2';\r\nexport class Loader {\r\n constructor(server, api, delegate) {\r\n switch (api) {\r\n case 'static':\r\n this.webrender = new WebRenderStatic();\r\n break;\r\n case 'v1':\r\n this.webrender = new WebRenderV1(server);\r\n break;\r\n case 'v2':\r\n this.webrender = new WebRenderV2(server);\r\n break;\r\n default:\r\n this.webrender = new WebRenderV1(server);\r\n break;\r\n }\r\n this.delegate = delegate;\r\n this.loadingId = 0;\r\n this.loaded = 0;\r\n this.total = 0;\r\n this.onLoadStart = delegate && delegate.onLoadStart ? delegate.onLoadStart : (() => { });\r\n this.onLoadProgress = delegate && delegate.onLoadProgress ? delegate.onLoadProgress : (() => { });\r\n this.onLoadEnd = delegate && delegate.onLoadEnd ? delegate.onLoadEnd : (() => { });\r\n }\r\n get progress() {\r\n return this.total ? this.loaded / this.total : 0;\r\n }\r\n async loadImageSnapshot(snapshot) {\r\n this.loadingId += 1;\r\n this.loaded = 0;\r\n this.total = 1;\r\n this.onLoadStart(this.progress);\r\n const { loadingId } = this;\r\n return this.webrender.image(snapshot).then(src => (this.loadImage(src, loadingId))).then(img => {\r\n this.onLoadEnd(this.progress);\r\n return img;\r\n });\r\n }\r\n async loadVideoSnapshot(video, snapshot) {\r\n this.loadingId += 1;\r\n this.loaded = 0;\r\n this.total = 1;\r\n this.onLoadStart(this.progress);\r\n const { loadingId } = this;\r\n return this.webrender.video(snapshot).then(src => (this.loadVideo(video, src, !!snapshot.view.loop, loadingId))).then(() => {\r\n this.onLoadEnd(this.progress);\r\n return video;\r\n });\r\n }\r\n async loadVRCubeSnapshot(snapshot) {\r\n this.loadingId += 1;\r\n this.loaded = 0;\r\n this.total = 0;\r\n this.onLoadStart(this.progress);\r\n const { loadingId } = this;\r\n return this.webrender.vrCube(snapshot).then(srcs => {\r\n this.total = srcs.length;\r\n const promises = srcs.map(src => this.loadImage(src, loadingId));\r\n return Promise.all(promises);\r\n }).then(imgs => {\r\n this.onLoadEnd(this.progress);\r\n return imgs;\r\n });\r\n }\r\n async loadVRObjectSnapshot(snapshot, position) {\r\n var _a;\r\n this.loadingId += 1;\r\n this.loaded = 0;\r\n this.total = 0;\r\n this.onLoadStart(this.progress);\r\n const { loadingId } = this;\r\n if (snapshot.view.animation) {\r\n if (((_a = snapshot.encoder) === null || _a === void 0 ? void 0 : _a.format) === 'mp4') {\r\n return this.webrender.video(snapshot).then(src => {\r\n return this.loadVideoFrames(src, snapshot.view.frames, 30, loadingId);\r\n });\r\n }\r\n else {\r\n return this.webrender.animation(snapshot).then(srcs => {\r\n return this.loadImageFrames(srcs, snapshot.view.loop, position, loadingId);\r\n });\r\n }\r\n }\r\n else {\r\n return this.webrender.vrObject(snapshot).then(srcs => {\r\n return this.loadImageFrames(srcs, snapshot.view.loop, position, loadingId);\r\n });\r\n }\r\n }\r\n async loadImage(src, loadingId) {\r\n const image = new Image();\r\n image.crossOrigin = location.protocol === 'file:' && !Loader.isValidHttpUrl(src) ? null : 'anonymous';\r\n const promise = new Promise((resolve, reject) => {\r\n image.addEventListener('load', () => {\r\n if (loadingId !== this.loadingId)\r\n return;\r\n this.loaded += 1;\r\n this.onLoadProgress(this.progress);\r\n resolve(image);\r\n }, { once: true });\r\n image.addEventListener('error', (e) => {\r\n if (loadingId !== this.loadingId)\r\n return;\r\n reject(`${e.type} : ${src}`);\r\n }, { once: true });\r\n });\r\n image.src = src;\r\n return promise;\r\n }\r\n loadImageFrames(srcs, loop, position, loadingId) {\r\n this.total = srcs.length;\r\n const promises = new Array(srcs.length);\r\n const start = position || 0;\r\n for (let i = 0, n = srcs.length; i < n; i += 1) {\r\n const step = Math.ceil(i / 2) * (i % 2 === 0 ? 1 : -1);\r\n const index = loop ? Maths.mod(start + step, n) : i;\r\n promises[index] = this.loadImage(srcs[index], loadingId);\r\n }\r\n Promise.all(promises).then(() => this.onLoadEnd(this.progress)).catch(() => { });\r\n return promises;\r\n }\r\n async loadVideo(video, src, loop, loadingId) {\r\n video.loop = loop;\r\n const promise = new Promise((resolve, reject) => {\r\n video.addEventListener('canplaythrough', () => {\r\n if (loadingId !== this.loadingId)\r\n return;\r\n this.loaded += 1;\r\n this.onLoadProgress(this.progress);\r\n resolve();\r\n }, { once: true });\r\n video.addEventListener('error', e => {\r\n if (loadingId !== this.loadingId)\r\n return;\r\n reject(`${e.type} : ${src}`);\r\n }, { once: true });\r\n });\r\n video.src = src;\r\n video.load();\r\n return promise;\r\n }\r\n async loadVideoFrame(video, fps, frames, i, loadingId) {\r\n let count = 0;\r\n return new Promise((resolve, reject) => {\r\n const seeked = () => {\r\n if (loadingId !== this.loadingId)\r\n return;\r\n if (count !== i) {\r\n count += 1;\r\n return;\r\n }\r\n video.removeEventListener('seeked', seeked);\r\n const canvas = document.createElement('canvas');\r\n canvas.width = video.videoWidth;\r\n canvas.height = video.videoHeight;\r\n const context = canvas.getContext('2d');\r\n context.drawImage(video, 0, 0);\r\n const image = new Image();\r\n image.src = canvas.toDataURL();\r\n resolve(image);\r\n this.loaded += 1;\r\n this.onLoadProgress(this.progress);\r\n if (i !== frames - 1) {\r\n video.currentTime += 1 / fps;\r\n }\r\n };\r\n video.addEventListener('seeked', seeked);\r\n video.addEventListener('error', e => {\r\n if (loadingId !== this.loadingId)\r\n return;\r\n reject(e);\r\n }, { once: true });\r\n });\r\n }\r\n loadVideoFrames(src, frames, fps, loadingId) {\r\n this.total = frames;\r\n const promises = new Array(frames);\r\n const video = document.createElement('video');\r\n for (let i = 0, n = frames; i < n; i += 1) {\r\n promises[i] = this.loadVideoFrame(video, fps, frames, i, loadingId);\r\n }\r\n video.addEventListener('canplaythrough', () => {\r\n if (loadingId !== this.loadingId)\r\n return;\r\n video.currentTime = (1 / fps) / 2;\r\n }, { once: true });\r\n video.src = src;\r\n video.load();\r\n Promise.all(promises).then(() => this.onLoadEnd(this.progress)).catch(() => { });\r\n return promises;\r\n }\r\n async loadImageHotspots(snapshot, tags) {\r\n if (!(this.webrender instanceof WebRenderV2)) {\r\n return Promise.reject(new Error('Hotspots only available with api V2'));\r\n }\r\n return await this.webrender.imageHotspots(snapshot, tags);\r\n }\r\n async loadVRCubeHotspots(snapshot, tags) {\r\n if (!(this.webrender instanceof WebRenderV2)) {\r\n return Promise.reject(new Error('Hotspots only available with api V2'));\r\n }\r\n return await this.webrender.vrCubeHotspots(snapshot, tags);\r\n }\r\n async loadVRObjectHotspots(snapshot, tags) {\r\n if (!(this.webrender instanceof WebRenderV2)) {\r\n return Promise.reject(new Error('Hotspots only available with api V2'));\r\n }\r\n return await this.webrender.vrObjectHotspots(snapshot, tags);\r\n }\r\n onLoadStart(progress) {\r\n if (this.delegate) {\r\n this.delegate.onLoadStart(progress);\r\n }\r\n }\r\n onLoadProgress(progress) {\r\n if (this.delegate) {\r\n this.delegate.onLoadProgress(progress);\r\n }\r\n }\r\n onLoadEnd(progress) {\r\n if (this.delegate) {\r\n this.delegate.onLoadEnd(progress);\r\n }\r\n }\r\n static isValidHttpUrl(str) {\r\n let url;\r\n try {\r\n url = new URL(str);\r\n }\r\n catch (_) {\r\n return false;\r\n }\r\n return url.protocol === \"http:\" || url.protocol === \"https:\";\r\n }\r\n}\r\n","export class Resolution {\r\n constructor(width, height) {\r\n this.width = width;\r\n this.height = height;\r\n }\r\n get aspect() {\r\n return this.width / this.height;\r\n }\r\n}\r\n","import { Resolution } from './Resolution';\r\nexport class Viewport {\r\n constructor(top, left, width, height) {\r\n this.top = top;\r\n this.left = left;\r\n this.width = width;\r\n this.height = height;\r\n }\r\n static fit(resolution, viewportResolution, fit) {\r\n const aspectRatio = resolution.aspect;\r\n const viewportRatio = viewportResolution.aspect;\r\n let width = 0;\r\n let height = 0;\r\n switch (fit) {\r\n case 'contain':\r\n width = viewportRatio < aspectRatio ? viewportResolution.width : viewportResolution.height * aspectRatio;\r\n height = viewportRatio < aspectRatio ? viewportResolution.width / aspectRatio : viewportResolution.height;\r\n break;\r\n case 'cover':\r\n default:\r\n width = viewportRatio < aspectRatio ? viewportResolution.height * aspectRatio : viewportResolution.width;\r\n height = viewportRatio < aspectRatio ? viewportResolution.height : viewportResolution.width / aspectRatio;\r\n break;\r\n case 'fill':\r\n width = viewportResolution.width;\r\n height = viewportResolution.height;\r\n break;\r\n }\r\n const top = (viewportResolution.height - height) / 2;\r\n const left = (viewportResolution.width - width) / 2;\r\n return new Viewport(top, left, width, height);\r\n }\r\n static getStandardAspectRatio(width, height) {\r\n if (width === 0 || height === 0) {\r\n return 0;\r\n }\r\n const aspectRatio = width / height;\r\n if (width < height) {\r\n const distanceTo34 = Math.abs(3 / 4 - aspectRatio);\r\n const distanceTo916 = Math.abs(9 / 16 - aspectRatio);\r\n return distanceTo34 < distanceTo916 ? 3 / 4 : 9 / 16;\r\n }\r\n const distanceTo43 = Math.abs(4 / 3 - aspectRatio);\r\n const distanceTo169 = Math.abs(16 / 9 - aspectRatio);\r\n return distanceTo43 < distanceTo169 ? 4 / 3 : 16 / 9;\r\n }\r\n static getStandardResolution(width, height) {\r\n if (width === 0 || height === 0) {\r\n return new Resolution(0, 0);\r\n }\r\n const aspectRatio = Viewport.getStandardAspectRatio(width, height);\r\n if (width < height) {\r\n const quality = Viewport.getStandardQuality(Math.max(height * aspectRatio, width));\r\n return new Resolution(Math.round(quality), Math.round(quality / aspectRatio));\r\n }\r\n const quality = Viewport.getStandardQuality(Math.max(width / aspectRatio, height));\r\n return new Resolution(Math.round(quality * aspectRatio), Math.round(quality));\r\n }\r\n static getStandardQuality(height) {\r\n if (height <= 240) {\r\n return 240;\r\n }\r\n if (height <= 360) {\r\n return 360;\r\n }\r\n if (height <= 480) {\r\n return 480;\r\n }\r\n if (height <= 720) {\r\n return 720;\r\n }\r\n return 1080;\r\n }\r\n}\r\n","import { Resolution } from './Resolution';\r\nimport { Viewport } from './Viewport';\r\nexport class Video {\r\n constructor() {\r\n this.element = document.createElement('video');\r\n this.element.classList.add('ls-viewer-video');\r\n this.element.style.opacity = '0';\r\n this.element.setAttribute('muted', '');\r\n this.element.setAttribute('playsinline', '');\r\n this.element.setAttribute('preload', 'auto');\r\n }\r\n show() {\r\n this.element.style.opacity = '1';\r\n }\r\n hide() {\r\n this.element.style.opacity = '0';\r\n }\r\n resize(width, height, resolution, fit) {\r\n const viewport = Viewport.fit(resolution, new Resolution(width, height), fit);\r\n this.element.style.top = `${viewport.top}px`;\r\n this.element.style.left = `${viewport.left}px`;\r\n this.element.style.width = `${viewport.width}px`;\r\n this.element.style.height = `${viewport.height}px`;\r\n if (resolution.width !== this.element.width || resolution.height !== this.element.height) {\r\n this.element.width = resolution.width;\r\n this.element.height = resolution.height;\r\n }\r\n }\r\n}\r\n","export class WidgetImage {\r\n constructor(container, canvas, loader) {\r\n this.container = container;\r\n this.canvas = canvas;\r\n this.loader = loader;\r\n this.hotspots = [];\r\n }\r\n destroy() { }\r\n show() {\r\n this.canvas.show(false);\r\n this.container.classList.add('ls-viewer-container-image');\r\n }\r\n hide() {\r\n this.canvas.hide(false);\r\n this.container.classList.remove('ls-viewer-container-image');\r\n }\r\n async goto(position) {\r\n return Promise.resolve();\r\n }\r\n async load(snapshot, tags, reset, fade) {\r\n let promise = Promise.resolve();\r\n const snapshotHash = JSON.stringify(snapshot);\r\n if (snapshotHash === this.snapshotHash && this.image) {\r\n promise = promise.then(() => this.canvas.draw(this.image, fade, 0.05));\r\n }\r\n else {\r\n promise = promise.then(() => this.loader.loadImageSnapshot(snapshot).then(image => {\r\n this.canvas.draw(image, fade, 0.05);\r\n this.image = image;\r\n }));\r\n }\r\n const tagsHash = JSON.stringify(tags);\r\n if (tags.length && (snapshotHash !== this.snapshotHash || tagsHash !== this.tagsHash)) {\r\n promise = promise.then(() => this.loader.loadImageHotspots(snapshot, tags).then(hotspots => {\r\n this.hotspots = hotspots;\r\n }));\r\n }\r\n this.snapshotHash = snapshotHash;\r\n this.tagsHash = tagsHash;\r\n return promise.then(() => Promise.resolve(this.hotspots));\r\n }\r\n snapshot(type, quality) {\r\n return this.canvas.element.toDataURL(type, quality);\r\n }\r\n onMouseDown(e) {\r\n }\r\n onMouseMove(e) {\r\n }\r\n onMouseUp(e) {\r\n }\r\n onMouseEnter(e) {\r\n }\r\n onTouchStart(e) {\r\n }\r\n onTouchMove(e) {\r\n }\r\n onTouchEnd(e) {\r\n }\r\n onDeviceOrientation(e) {\r\n }\r\n}\r\n","export class WidgetVideo {\r\n constructor(container, video, loader) {\r\n this.container = container;\r\n this.loader = loader;\r\n this.video = video;\r\n }\r\n destroy() { }\r\n show() {\r\n this.video.show();\r\n this.container.classList.add('ls-viewer-container-video');\r\n }\r\n hide() {\r\n this.video.hide();\r\n this.container.classList.remove('ls-viewer-container-video');\r\n }\r\n async goto(position) {\r\n return Promise.resolve();\r\n }\r\n async load(snapshot) {\r\n const hash = JSON.stringify(snapshot);\r\n if (hash === this.hash) {\r\n this.video.element.load();\r\n return Promise.resolve([]);\r\n }\r\n this.hash = hash;\r\n return this.loader.loadVideoSnapshot(this.video.element, snapshot).then(() => Promise.resolve([]));\r\n }\r\n snapshot(type, quality) {\r\n return 'data:image/gif;base64,R0lGODlhAQABAIAAAP7//wAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==';\r\n }\r\n async play() {\r\n return new Promise((resolve, reject) => {\r\n this.video.element.addEventListener('ended', () => {\r\n resolve();\r\n }, { once: true });\r\n const promise = this.video.element.play();\r\n if (promise) {\r\n promise.catch(() => {\r\n reject();\r\n });\r\n }\r\n this.show();\r\n });\r\n }\r\n onMouseDown(e) {\r\n }\r\n onMouseMove(e) {\r\n }\r\n onMouseUp(e) {\r\n }\r\n onMouseEnter(e) {\r\n }\r\n onTouchStart(e) {\r\n }\r\n onTouchMove(e) {\r\n }\r\n onTouchEnd(e) {\r\n }\r\n onDeviceOrientation(e) {\r\n }\r\n}\r\n","export class Point {\r\n constructor(x, y) {\r\n this.x = x;\r\n this.y = y;\r\n }\r\n clone() {\r\n return new Point(this.x, this.y);\r\n }\r\n}\r\n","import { Point } from './Point';\r\nexport class EventHelper {\r\n static pointFromMouseEvent(e) {\r\n return new Point(e.screenX, e.screenY);\r\n }\r\n static pointFromTouchEvent(e) {\r\n const touch = e.targetTouches[0] || e.changedTouches[0];\r\n return new Point(touch.screenX, touch.screenY);\r\n }\r\n}\r\n","import { m4, v3 } from 'twgl.js';\r\nexport class Basis3 {\r\n constructor(...args) {\r\n if (args.length === 3) {\r\n ({ 0: this.u, 1: this.v, 2: this.o } = args);\r\n this.w = v3.cross(this.u, this.v);\r\n }\r\n else if (args.length === 4) {\r\n ({ 0: this.u, 1: this.v, 2: this.w, 3: this.o } = args);\r\n }\r\n else {\r\n this.u = [1, 0, 0];\r\n this.v = [0, 1, 0];\r\n this.w = [0, 0, 1];\r\n this.o = [0, 0, 0];\r\n }\r\n }\r\n get localToGlobalMatrix() {\r\n const X = [this.u[0], this.u[1], this.u[2], 0.0];\r\n const Y = [this.v[0], this.v[1], this.v[2], 0.0];\r\n const Z = [this.w[0], this.w[1], this.w[2], 0.0];\r\n const W = [this.o[0], this.o[1], this.o[2], 1.0];\r\n return [...X, ...Y, ...Z, ...W];\r\n }\r\n get globalToLocalMatrix() {\r\n return m4.inverse(this.localToGlobalMatrix);\r\n }\r\n}\r\n","export class InertiaPoint {\r\n constructor(x, y, time) {\r\n this.x = x;\r\n this.y = y;\r\n this.time = time;\r\n }\r\n}\r\n","import { InertiaPoint } from './InertiaPoint';\r\nimport { Point } from './Point';\r\nexport class Inertia {\r\n constructor(onMotion) {\r\n this.points = [];\r\n this.onMotion = onMotion;\r\n this.lastPoint = new Point(0.0, 0.0);\r\n this.velocity = new Point(0.0, 0.0);\r\n this.loop = this.loop.bind(this);\r\n }\r\n destroy() {\r\n if (this.animationFrameId) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = undefined;\r\n }\r\n }\r\n track(point) {\r\n const time = Date.now();\r\n this.points = this.points.filter(p => time - p.time <= 100);\r\n this.points.push(new InertiaPoint(point.x, point.y, time));\r\n this.lastPoint = point;\r\n }\r\n start() {\r\n if (this.points.length === 0) {\r\n return;\r\n }\r\n const firstPoint = this.points[0];\r\n const lastPoint = this.points[this.points.length - 1];\r\n const dx = lastPoint.x - firstPoint.x;\r\n const dy = lastPoint.y - firstPoint.y;\r\n const dt = lastPoint.time - firstPoint.time;\r\n this.velocity = new Point(dt === 0 ? 0 : dx / (dt / 15), dt === 0 ? 0 : dy / (dt / 15));\r\n if (this.animationFrameId) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = undefined;\r\n }\r\n this.animationFrameId = requestAnimationFrame(this.loop);\r\n }\r\n stop() {\r\n if (this.animationFrameId) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = undefined;\r\n }\r\n this.points = [];\r\n }\r\n loop() {\r\n if ((Math.abs(this.velocity.x) < 1 && Math.abs(this.velocity.y) < 1)) {\r\n this.animationFrameId = undefined;\r\n this.points = [];\r\n return;\r\n }\r\n this.lastPoint.x += this.velocity.x;\r\n this.lastPoint.y += this.velocity.y;\r\n this.velocity.x *= 0.9;\r\n this.velocity.y *= 0.9;\r\n this.onMotion(this.lastPoint.clone());\r\n this.animationFrameId = requestAnimationFrame(this.loop);\r\n }\r\n}\r\n","import { m4, v3 } from 'twgl.js';\r\nexport class PointOfView {\r\n constructor(target, eye, up) {\r\n this.target = v3.copy(target);\r\n this.eye = v3.copy(eye);\r\n this.up = v3.copy(up);\r\n }\r\n get viewVector() {\r\n return v3.subtract(this.target, this.eye);\r\n }\r\n get rightVector() {\r\n return v3.normalize(v3.cross(this.viewVector, this.up));\r\n }\r\n get viewMatrix() {\r\n return m4.inverse(m4.lookAt(this.eye, this.target, this.up));\r\n }\r\n clone() {\r\n return new PointOfView(v3.copy(this.target), v3.copy(this.eye), v3.copy(this.up));\r\n }\r\n}\r\nPointOfView.default = new PointOfView([0.0, 0.0, 0.0], [2.0, 2.0, 2.0], [0.0, 1.0, 0.0]);\r\n","import { m4, v3 } from 'twgl.js';\r\nimport { Basis3 } from './Basis3';\r\nimport { Inertia } from './Inertia';\r\nimport { Maths } from './Maths';\r\nimport { Point } from './Point';\r\nimport { PointOfView } from './PointOfView';\r\nexport class InteractiveCamera {\r\n constructor(pov, fov, onMotion) {\r\n this.isStarted = false;\r\n this.pov = pov;\r\n this.fov = Maths.degreesToRadians(fov);\r\n this.orientationMatrix = m4.identity();\r\n this.inertia = new Inertia(this.motion.bind(this));\r\n this.onMotion = onMotion;\r\n this.initPov = this.pov;\r\n this.initFov = this.fov;\r\n this.initOrientation = Maths.degreesToRadians(window.orientation) || 0;\r\n this.startPov = new PointOfView([0.0, 0.0, 1.0], [0.0, 0.0, 0.0], [0.0, 1.0, 0.0]);\r\n this.startSize = { width: 0.0, height: 0.0 };\r\n this.previousPoint = new Point(0.0, 0.0);\r\n }\r\n destroy() {\r\n this.inertia.destroy();\r\n }\r\n get orientedPov() {\r\n const viewVector = v3.normalize(v3.cross(this.pov.up, this.pov.target));\r\n const headBasis = new Basis3(viewVector, [0.0, 1.0, 0.0], this.pov.eye);\r\n const matrix = m4.identity();\r\n m4.multiply(matrix, headBasis.localToGlobalMatrix, matrix);\r\n m4.multiply(matrix, this.orientationMatrix, matrix);\r\n m4.multiply(matrix, headBasis.globalToLocalMatrix, matrix);\r\n const target = m4.transformDirection(matrix, this.pov.target);\r\n const eye = this.pov.eye;\r\n const up = m4.transformDirection(matrix, this.pov.up);\r\n return new PointOfView(target, eye, up);\r\n }\r\n reset() {\r\n this.pov = this.initPov.clone();\r\n this.fov = this.initFov;\r\n }\r\n start(point, size) {\r\n this.isStarted = true;\r\n this.startPov = this.pov;\r\n this.startSize = size;\r\n this.previousPoint = point;\r\n this.inertia.stop();\r\n }\r\n motion(point) {\r\n if (this.isStarted) {\r\n this.inertia.track(point);\r\n }\r\n const delta = {\r\n x: point.x - this.previousPoint.x,\r\n y: point.y - this.previousPoint.y,\r\n };\r\n const dx = (Maths.accelerate(delta.x, 1.3) / this.startSize.width) * 0.2 * Math.PI * 1.5;\r\n const dy = (Maths.accelerate(delta.y, 1.3) / this.startSize.height) * 0.2 * Math.PI;\r\n const rotationMatrix = m4.multiply(m4.rotationY(-dx), m4.rotationX(-dy));\r\n const viewVector = v3.normalize(v3.cross(this.pov.up, this.pov.target));\r\n const headBasis = new Basis3(viewVector, [0.0, 1.0, 0.0], this.pov.eye);\r\n const headMatrix = m4.identity();\r\n m4.multiply(headMatrix, headBasis.localToGlobalMatrix, headMatrix);\r\n m4.multiply(headMatrix, rotationMatrix, headMatrix);\r\n m4.multiply(headMatrix, headBasis.globalToLocalMatrix, headMatrix);\r\n const target = m4.transformPoint(headMatrix, this.pov.target);\r\n const up = m4.transformDirection(headMatrix, this.pov.up);\r\n if (v3.cross(up, [0, 0, 1])[0] >= 0) {\r\n this.pov.target = target;\r\n this.pov.up = up;\r\n }\r\n this.previousPoint = point;\r\n this.onMotion();\r\n }\r\n end(point, inertia) {\r\n this.isStarted = false;\r\n if (inertia) {\r\n this.inertia.track(point);\r\n this.inertia.start();\r\n }\r\n }\r\n orientation(alpha, beta, gamma) {\r\n const orientation = Maths.degreesToRadians(window.orientation) || 0;\r\n const alphaRadians = Maths.degreesToRadians(alpha);\r\n const betaRadians = Maths.degreesToRadians(-beta);\r\n const gammaRadians = Maths.degreesToRadians(-gamma);\r\n const matrix = m4.rotationX(Maths.degreesToRadians(90));\r\n m4.rotateZ(matrix, this.initOrientation, matrix);\r\n m4.rotateZ(matrix, alphaRadians, matrix);\r\n m4.rotateX(matrix, betaRadians, matrix);\r\n m4.rotateY(matrix, gammaRadians, matrix);\r\n m4.rotateZ(matrix, -orientation, matrix);\r\n this.orientationMatrix = matrix;\r\n this.onMotion();\r\n }\r\n}\r\n","import * as twgl from 'twgl.js';\r\nimport { m4, v3 } from 'twgl.js';\r\nimport { EventHelper } from './EventHelper';\r\nimport { InteractiveCamera } from './InteractiveCamera';\r\nimport { Maths } from './Maths';\r\nimport { PointOfView } from './PointOfView';\r\nimport WidgetVRCubeFragmentShader from './WidgetVRCube.frag';\r\nimport WidgetVRCubeVertexShader from './WidgetVRCube.vert';\r\nexport class WidgetVRCube {\r\n constructor(container, canvas, loader, onInteraction) {\r\n this.container = container;\r\n this.canvas = canvas;\r\n this.loader = loader;\r\n this.images = [];\r\n this.hotspotsList = [[]];\r\n const pov = new PointOfView([0.0, 0.0, 1.0], [0.0, 0.0, 0.0], [0.0, 1.0, 0.0]);\r\n const fov = 60;\r\n const rotationMatrix = m4.rotationX(Maths.degreesToRadians(15));\r\n m4.transformDirection(rotationMatrix, pov.target, pov.target);\r\n m4.transformDirection(rotationMatrix, pov.up, pov.up);\r\n this.interaction = new InteractiveCamera(pov, fov, () => {\r\n this.animationFrameId = requestAnimationFrame(this.render);\r\n this.onInteraction({\r\n pov: this.interaction.pov.clone(),\r\n fov: this.interaction.fov\r\n });\r\n });\r\n this.onInteraction = onInteraction;\r\n this.gl = this.canvas.context;\r\n this.programInfo = twgl.createProgramInfo(this.gl, [`${WidgetVRCubeVertexShader}\\n`, `${WidgetVRCubeFragmentShader}\\n`]);\r\n this.quad = twgl.primitives.createXYQuadBufferInfo(this.gl);\r\n this.uniforms = {\r\n u_matrix: m4.identity(),\r\n u_mix: 0.0,\r\n u_texture_back: twgl.createTexture(this.gl, {\r\n target: this.gl.TEXTURE_CUBE_MAP,\r\n minMag: this.gl.LINEAR,\r\n width: 1,\r\n height: 1,\r\n }),\r\n u_texture: twgl.createTexture(this.gl, {\r\n target: this.gl.TEXTURE_CUBE_MAP,\r\n minMag: this.gl.LINEAR,\r\n width: 1,\r\n height: 1,\r\n }),\r\n };\r\n this.render = this.render.bind(this);\r\n }\r\n destroy() {\r\n this.interaction.destroy();\r\n if (this.animationFrameId) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = undefined;\r\n }\r\n }\r\n show() {\r\n this.canvas.show();\r\n this.container.classList.add('ls-viewer-container-vrcube');\r\n }\r\n hide() {\r\n this.canvas.hide();\r\n this.container.classList.remove('ls-viewer-container-vrcube');\r\n }\r\n async goto(position) {\r\n return Promise.resolve();\r\n }\r\n get pov() {\r\n return this.interaction.pov;\r\n }\r\n set pov(pov) {\r\n if (this.interaction.pov.eye.every((v, i) => v === pov.eye[i])\r\n && this.interaction.pov.target.every((v, i) => v === pov.target[i])\r\n && this.interaction.pov.up.every((v, i) => v === pov.up[i])) {\r\n return;\r\n }\r\n this.interaction.pov = pov.clone();\r\n this.animationFrameId = requestAnimationFrame(this.render);\r\n }\r\n get fov() {\r\n return Maths.radiansToDegrees(this.interaction.fov);\r\n }\r\n set fov(fov) {\r\n if (this.interaction.fov === fov) {\r\n return;\r\n }\r\n this.interaction.fov = Maths.degreesToRadians(fov);\r\n this.animationFrameId = requestAnimationFrame(this.render);\r\n }\r\n get hotspots() {\r\n const result = [];\r\n this.hotspotsList.flat();\r\n const width = this.canvas.element.clientWidth;\r\n const height = this.canvas.element.clientHeight;\r\n const modelViewProjectionMatrix = m4.inverse(this.modelViewProjectionMatrix);\r\n this.hotspotsList.forEach((hotspots, i) => {\r\n hotspots.forEach(hotspot => {\r\n const s = hotspot.position2D.x / this.images[0].width;\r\n const t = hotspot.position2D.y / this.images[0].height;\r\n let rx = 0;\r\n let ry = 0;\r\n let rz = 0;\r\n switch (i) {\r\n case 0:\r\n if (this.pov.target[2] < 0) {\r\n return;\r\n }\r\n rx = (2 * s - 1);\r\n ry = (2 * t - 1) * -1;\r\n rz = 1;\r\n break;\r\n case 1:\r\n if (this.pov.target[0] < 0) {\r\n return;\r\n }\r\n rx = 1;\r\n ry = (2 * t - 1) * -1;\r\n rz = (1 - 2 * s);\r\n break;\r\n case 2:\r\n if (this.pov.target[2] > 0) {\r\n return;\r\n }\r\n rx = (1 - 2 * s);\r\n ry = (2 * t - 1) * -1;\r\n rz = -1;\r\n break;\r\n case 3:\r\n if (this.pov.target[0] > 0) {\r\n return;\r\n }\r\n rx = -1;\r\n ry = (2 * t - 1) * -1;\r\n rz = (2 * s - 1);\r\n break;\r\n case 4:\r\n if (this.pov.target[1] < 0) {\r\n return;\r\n }\r\n rx = (2 * s - 1);\r\n ry = 1;\r\n rz = (2 * t - 1);\r\n break;\r\n case 5:\r\n if (this.pov.target[1] > 0) {\r\n return;\r\n }\r\n rx = (2 * s - 1);\r\n ry = -1;\r\n rz = (2 * t - 1) * -1;\r\n break;\r\n }\r\n const point3D = v3.normalize([rx, ry, rz]);\r\n const point2D = m4.transformPoint(modelViewProjectionMatrix, point3D);\r\n const position2D = {\r\n x: width - 0.5 * width * (point2D[0] + 1),\r\n y: height - 0.5 * height * (point2D[1] + 1)\r\n };\r\n result.push(Object.assign(Object.assign({}, hotspot), { position2D }));\r\n });\r\n });\r\n return result;\r\n }\r\n async load(snapshot, tags, reset, fade) {\r\n let promise = Promise.resolve();\r\n const snapshotHash = JSON.stringify(snapshot);\r\n if (snapshotHash === this.snapshotHash) {\r\n promise = promise.then(() => Promise.resolve());\r\n }\r\n else {\r\n this.images = [];\r\n this.animationFrameId = requestAnimationFrame(this.render);\r\n promise = promise.then(() => this.loader.loadVRCubeSnapshot(snapshot).then(images => {\r\n this.images = images;\r\n twgl.createTexture(this.gl, {\r\n target: this.gl.TEXTURE_CUBE_MAP,\r\n minMag: this.gl.LINEAR,\r\n auto: false,\r\n cubeFaceOrder: [\r\n this.gl.TEXTURE_CUBE_MAP_POSITIVE_Z,\r\n this.gl.TEXTURE_CUBE_MAP_POSITIVE_X,\r\n this.gl.TEXTURE_CUBE_MAP_NEGATIVE_Z,\r\n this.gl.TEXTURE_CUBE_MAP_NEGATIVE_X,\r\n this.gl.TEXTURE_CUBE_MAP_POSITIVE_Y,\r\n this.gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,\r\n ],\r\n src: images,\r\n }, (err, texture) => {\r\n if (err) {\r\n return;\r\n }\r\n if (reset) {\r\n this.interaction.reset();\r\n }\r\n this.uniforms.u_mix = fade ? 0.0 : 1.0;\r\n this.uniforms.u_texture_back = this.uniforms.u_texture;\r\n this.uniforms.u_texture = texture;\r\n this.animationFrameId = requestAnimationFrame(this.render);\r\n });\r\n }));\r\n }\r\n const tagsHash = JSON.stringify(tags);\r\n if (tags.length && (snapshotHash !== this.snapshotHash || tagsHash !== this.tagsHash)) {\r\n promise = promise.then(() => this.loader.loadVRCubeHotspots(snapshot, tags).then(hotspots => {\r\n this.hotspotsList = hotspots;\r\n }));\r\n }\r\n this.snapshotHash = snapshotHash;\r\n this.tagsHash = tagsHash;\r\n return promise.then(() => Promise.resolve(this.hotspots));\r\n }\r\n snapshot(type, quality) {\r\n return this.canvas.element.toDataURL(type, quality);\r\n }\r\n get modelViewProjectionMatrix() {\r\n const fov = this.interaction.fov;\r\n const width = this.canvas.element.clientWidth;\r\n const height = this.canvas.element.clientHeight;\r\n const aspect = width / height;\r\n const projectionMatrixInverse = m4.inverse(m4.perspective(fov, aspect, 0.5, 100));\r\n const pov = this.interaction.orientedPov;\r\n const viewMatrixInverse = m4.lookAt(pov.eye, pov.target, pov.up);\r\n return m4.multiply(viewMatrixInverse, projectionMatrixInverse);\r\n }\r\n render() {\r\n twgl.resizeCanvasToDisplaySize(this.canvas.element, window.devicePixelRatio);\r\n this.gl.viewport(0, 0, this.gl.canvas.width, this.gl.canvas.height);\r\n this.uniforms.u_matrix = this.modelViewProjectionMatrix;\r\n this.gl.useProgram(this.programInfo.program);\r\n twgl.setBuffersAndAttributes(this.gl, this.programInfo, this.quad);\r\n twgl.setUniforms(this.programInfo, this.uniforms);\r\n twgl.drawBufferInfo(this.gl, this.quad);\r\n if (this.uniforms.u_mix < 1.0) {\r\n this.uniforms.u_mix = Math.min(this.uniforms.u_mix + 0.05, 1.0);\r\n this.animationFrameId = requestAnimationFrame(this.render);\r\n }\r\n }\r\n onMouseDown(e) {\r\n this.container.classList.add('ls-viewer-container-vrcube-grabbing');\r\n this.interaction.start(EventHelper.pointFromMouseEvent(e), {\r\n width: this.gl.canvas.width,\r\n height: this.gl.canvas.height,\r\n });\r\n }\r\n onMouseMove(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n this.interaction.motion(EventHelper.pointFromMouseEvent(e));\r\n e.preventDefault();\r\n }\r\n onMouseUp(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n this.container.classList.remove('ls-viewer-container-vrcube-grabbing');\r\n this.interaction.end(EventHelper.pointFromMouseEvent(e), true);\r\n }\r\n onMouseEnter(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n if (e.buttons === 0) {\r\n this.container.classList.remove('ls-viewer-container-vrcube-grabbing');\r\n this.interaction.end(EventHelper.pointFromMouseEvent(e), false);\r\n }\r\n }\r\n onTouchStart(e) {\r\n this.container.classList.add('ls-viewer-container-vrcube-grabbing');\r\n this.interaction.start(EventHelper.pointFromTouchEvent(e), {\r\n width: this.gl.canvas.width,\r\n height: this.gl.canvas.height,\r\n });\r\n }\r\n onTouchMove(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n this.interaction.motion(EventHelper.pointFromTouchEvent(e));\r\n e.preventDefault();\r\n }\r\n onTouchEnd(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n this.container.classList.remove('ls-viewer-container-vrcube-grabbing');\r\n this.interaction.end(EventHelper.pointFromTouchEvent(e), true);\r\n }\r\n onDeviceOrientation(e) {\r\n this.interaction.orientation(e.alpha, e.beta, e.gamma);\r\n }\r\n}\r\n","import regression from 'regression';\r\nimport { Inertia } from './Inertia';\r\nimport { Maths } from './Maths';\r\nimport { Point } from './Point';\r\nexport class InteractivePosition {\r\n constructor(position, frames, rows, loop, onMotion) {\r\n this.isStarted = false;\r\n this.position = position;\r\n this.frames = frames;\r\n this.rows = rows;\r\n this.loop = loop;\r\n this.onMotion = onMotion;\r\n this.inertia = new Inertia(this.motion.bind(this));\r\n this.initPosition = this.position;\r\n this.startPosition = { x: 0.0, y: 0.0 };\r\n this.startPoint = new Point(0.0, 0.0);\r\n this.startSize = { width: 0.0, height: 0.0 };\r\n this.lastPoints = [];\r\n this.lastPointsNumber = 20;\r\n }\r\n destroy() {\r\n this.inertia.destroy();\r\n }\r\n reset() {\r\n this.position = this.initPosition;\r\n }\r\n get positionIndex() {\r\n return this.frames * this.position.y + this.position.x;\r\n }\r\n start(point, size) {\r\n this.isStarted = true;\r\n this.startPosition = Object.assign({}, this.position);\r\n this.startPoint = point;\r\n this.startSize = size;\r\n this.lastPoints = [];\r\n this.inertia.stop();\r\n }\r\n motion(point) {\r\n if (this.isStarted) {\r\n this.inertia.track(point);\r\n }\r\n this.lastPoints.push({ x: point.x, y: point.y });\r\n this.lastPoints.splice(0, this.lastPoints.length - this.lastPointsNumber);\r\n const regressionResult = regression.linear(this.lastPoints.map(p => [p.x, p.y]));\r\n const minDistance = 25;\r\n if (Math.abs(regressionResult.equation[0]) < 1) {\r\n const dx = (Maths.accelerate(point.x - this.startPoint.x, 1.3) / this.startSize.width) * (this.frames / 4);\r\n let positionX = this.startPosition.x - Math.round(dx);\r\n positionX = this.loop ? Maths.mod(positionX, this.frames) : Math.max(0, Math.min(positionX, this.frames - 1));\r\n if (positionX !== this.position.x) {\r\n this.position.x = positionX;\r\n this.onMotion();\r\n }\r\n const minX = Math.min(...this.lastPoints.map(p => p.x));\r\n const maxX = Math.max(...this.lastPoints.map(p => p.x));\r\n if (maxX - minX > minDistance) {\r\n this.startPoint.y = point.y;\r\n this.startPosition.y = this.position.y;\r\n }\r\n }\r\n else {\r\n const dy = (Maths.accelerate(point.y - this.startPoint.y, 1.7) / this.startSize.height) * (this.rows / 4);\r\n let positionY = this.startPosition.y + Math.round(dy);\r\n positionY = Math.max(0, Math.min(positionY, this.rows - 1));\r\n if (positionY !== this.position.y) {\r\n this.position.y = positionY;\r\n this.onMotion();\r\n }\r\n const minY = Math.min(...this.lastPoints.map(p => p.y));\r\n const maxY = Math.max(...this.lastPoints.map(p => p.y));\r\n if (maxY - minY > minDistance) {\r\n this.startPoint.x = point.x;\r\n this.startPosition.x = this.position.x;\r\n }\r\n }\r\n }\r\n end(point, inertia) {\r\n this.isStarted = false;\r\n if (inertia) {\r\n this.inertia.track(point);\r\n this.inertia.start();\r\n }\r\n }\r\n}\r\n","import { EventHelper } from './EventHelper';\r\nimport { InteractivePosition } from './InteractivePosition';\r\nimport { Maths } from './Maths';\r\nexport class WidgetVRObject {\r\n constructor(container, canvas, loader, onInteraction) {\r\n this.container = container;\r\n this.canvas = canvas;\r\n this.loader = loader;\r\n this.images = [];\r\n this.frames = 24;\r\n this.hotspotsList = [[]];\r\n this.interaction = new InteractivePosition({ x: 0, y: 0 }, 1, 1, false, () => {\r\n this.canvas.draw(this.image, true, 0.5);\r\n this.onInteraction({\r\n position: Object.assign({}, this.interaction.position),\r\n });\r\n });\r\n this.onInteraction = onInteraction;\r\n }\r\n destroy() {\r\n if (this.animationFrameId) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = undefined;\r\n }\r\n }\r\n show() {\r\n this.canvas.show(false);\r\n this.container.classList.add('ls-viewer-container-vrobject');\r\n }\r\n hide() {\r\n this.canvas.hide(false);\r\n this.container.classList.remove('ls-viewer-container-vrobject');\r\n }\r\n async goto(position) {\r\n return new Promise((resolve) => {\r\n const pos = Object.assign({}, this.interaction.position);\r\n const goToLoop = () => {\r\n if (this.interaction.position.x === position.x && this.interaction.position.y === position.y) {\r\n resolve();\r\n }\r\n else {\r\n let signX = pos.x > position.x ? -1 : 1;\r\n if (this.interaction.loop) {\r\n if (((this.interaction.frames - pos.x) + position.x) < Math.abs(position.x - pos.x)) {\r\n signX *= -1;\r\n }\r\n }\r\n pos.x += 0.5 * signX;\r\n this.position.x = Math.floor(pos.x);\r\n const signY = pos.y > position.y ? -1 : 1;\r\n pos.y += 0.5 * signY;\r\n this.animationFrameId = requestAnimationFrame(goToLoop);\r\n }\r\n };\r\n this.animationFrameId = requestAnimationFrame(goToLoop);\r\n });\r\n }\r\n set initPosition(position) {\r\n this.interaction.initPosition = position;\r\n }\r\n get position() {\r\n return this.interaction.position;\r\n }\r\n set position(position) {\r\n if (this.interaction.position.x === position.x && this.interaction.position.y === position.y) {\r\n return;\r\n }\r\n if (this.interaction.loop) {\r\n this.interaction.position.x = Maths.mod(position.x, this.interaction.frames);\r\n }\r\n else {\r\n this.interaction.position.x = Math.max(0, Math.min(position.x, this.interaction.frames - 1));\r\n }\r\n this.interaction.position.y = Math.max(0, Math.min(position.y, this.interaction.rows - 1));\r\n this.canvas.draw(this.image, true, 0.5);\r\n }\r\n get image() {\r\n return this.images[this.interaction.positionIndex];\r\n }\r\n get hotspots() {\r\n return this.hotspotsList[this.interaction.positionIndex] || [];\r\n }\r\n async load(snapshot, tags, reset, fade) {\r\n let promise = Promise.resolve();\r\n if (reset) {\r\n this.interaction.reset();\r\n }\r\n const snapshotHash = JSON.stringify(snapshot);\r\n if (snapshotHash === this.snapshotHash && this.image) {\r\n promise = promise.then(() => this.canvas.draw(this.image, fade, 0.05));\r\n }\r\n else {\r\n this.images = [];\r\n promise = promise.then(() => this.loader.loadVRObjectSnapshot(snapshot, this.interaction.positionIndex).then(promises => {\r\n const frames = promises.length;\r\n this.images = new Array(frames);\r\n this.interaction.frames = snapshot.view.frames || this.frames;\r\n this.interaction.rows = frames / this.interaction.frames;\r\n this.interaction.loop = !!snapshot.view.loop;\r\n if (reset) {\r\n this.interaction.reset();\r\n }\r\n promises.forEach((promise, i) => {\r\n promise.then((img) => {\r\n this.images[i] = img;\r\n if (img === this.image) {\r\n this.canvas.draw(this.image, fade, 0.05);\r\n }\r\n }).catch(() => { });\r\n });\r\n return promises[this.interaction.positionIndex].then(() => Promise.resolve());\r\n }));\r\n }\r\n const tagsHash = JSON.stringify(tags);\r\n if (tags.length && (snapshotHash !== this.snapshotHash || tagsHash !== this.tagsHash)) {\r\n promise = promise.then(() => this.loader.loadVRObjectHotspots(snapshot, tags).then(hotspots => {\r\n this.hotspotsList = hotspots;\r\n }));\r\n }\r\n this.snapshotHash = snapshotHash;\r\n this.tagsHash = tagsHash;\r\n return promise.then(() => Promise.resolve(this.hotspots));\r\n }\r\n snapshot(type, quality) {\r\n return this.canvas.element.toDataURL(type, quality);\r\n }\r\n onMouseDown(e) {\r\n this.container.classList.add('ls-viewer-container-vrobject-grabbing');\r\n this.interaction.start(EventHelper.pointFromMouseEvent(e), {\r\n width: this.canvas.element.width,\r\n height: this.canvas.element.height,\r\n });\r\n }\r\n onMouseMove(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n this.interaction.motion(EventHelper.pointFromMouseEvent(e));\r\n e.preventDefault();\r\n }\r\n onMouseUp(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n this.container.classList.remove('ls-viewer-container-vrobject-grabbing');\r\n this.interaction.end(EventHelper.pointFromMouseEvent(e), true);\r\n }\r\n onMouseEnter(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n if (e.buttons === 0) {\r\n this.container.classList.remove('ls-viewer-container-vrobject-grabbing');\r\n this.interaction.end(EventHelper.pointFromMouseEvent(e), false);\r\n }\r\n }\r\n onTouchStart(e) {\r\n this.container.classList.add('ls-viewer-container-vrobject-grabbing');\r\n this.interaction.start(EventHelper.pointFromTouchEvent(e), {\r\n width: this.canvas.element.width,\r\n height: this.canvas.element.height,\r\n });\r\n }\r\n onTouchMove(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n this.interaction.motion(EventHelper.pointFromTouchEvent(e));\r\n e.preventDefault();\r\n }\r\n onTouchEnd(e) {\r\n if (!this.interaction.isStarted) {\r\n return;\r\n }\r\n this.container.classList.remove('ls-viewer-container-vrobject-grabbing');\r\n this.interaction.end(EventHelper.pointFromTouchEvent(e), true);\r\n }\r\n onDeviceOrientation(e) {\r\n }\r\n}\r\n","export var WRAPIv2;\r\n(function (WRAPIv2) {\r\n let SunShadowQualityMode;\r\n (function (SunShadowQualityMode) {\r\n SunShadowQualityMode[\"VeryLow\"] = \"veryLow\";\r\n SunShadowQualityMode[\"Low\"] = \"low\";\r\n SunShadowQualityMode[\"Medium\"] = \"medium\";\r\n SunShadowQualityMode[\"Fine\"] = \"fine\";\r\n SunShadowQualityMode[\"Ultra\"] = \"ultra\";\r\n })(SunShadowQualityMode = WRAPIv2.SunShadowQualityMode || (WRAPIv2.SunShadowQualityMode = {}));\r\n let SunShadowSmoothnessMode;\r\n (function (SunShadowSmoothnessMode) {\r\n SunShadowSmoothnessMode[\"None\"] = \"none\";\r\n SunShadowSmoothnessMode[\"Weak\"] = \"weak\";\r\n SunShadowSmoothnessMode[\"Normal\"] = \"normal\";\r\n SunShadowSmoothnessMode[\"Fine\"] = \"fine\";\r\n SunShadowSmoothnessMode[\"UltraFine\"] = \"ultraFine\";\r\n SunShadowSmoothnessMode[\"Max\"] = \"max\";\r\n })(SunShadowSmoothnessMode = WRAPIv2.SunShadowSmoothnessMode || (WRAPIv2.SunShadowSmoothnessMode = {}));\r\n let SunUseCaseMode;\r\n (function (SunUseCaseMode) {\r\n SunUseCaseMode[\"Manual\"] = \"manual\";\r\n SunUseCaseMode[\"ExtractedFromEnv\"] = \"extractedFromEnv\";\r\n })(SunUseCaseMode = WRAPIv2.SunUseCaseMode || (WRAPIv2.SunUseCaseMode = {}));\r\n})(WRAPIv2 || (WRAPIv2 = {}));\r\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import debounce from 'debounce-promise';\r\nimport { Canvas2D } from './Canvas2D';\r\nimport { Canvas3D } from './Canvas3D';\r\nimport { Loader } from './Loader';\r\nimport { Resolution } from './Resolution';\r\nimport { Video } from './Video';\r\nimport { Viewport } from './Viewport';\r\nimport { WidgetImage } from './WidgetImage';\r\nimport { WidgetVideo } from './WidgetVideo';\r\nimport { WidgetVRCube } from './WidgetVRCube';\r\nimport { WidgetVRObject } from './WidgetVRObject';\r\nimport './index.css';\r\nexport class Viewer {\r\n constructor(container, options) {\r\n this.checkResize = this.checkResize.bind(this);\r\n this.onDeviceOrientation = this.onDeviceOrientation.bind(this);\r\n this.onResize = this.onResize.bind(this);\r\n this.onMouseDown = this.onMouseDown.bind(this);\r\n this.onMouseMove = this.onMouseMove.bind(this);\r\n this.onMouseUp = this.onMouseUp.bind(this);\r\n this.onMouseEnter = this.onMouseEnter.bind(this);\r\n this.onTouchStart = this.onTouchStart.bind(this);\r\n this.onTouchMove = this.onTouchMove.bind(this);\r\n this.onTouchEnd = this.onTouchEnd.bind(this);\r\n this.onLoadStart = this.onLoadStart.bind(this);\r\n this.onLoadProgress = this.onLoadProgress.bind(this);\r\n this.onLoadEnd = this.onLoadEnd.bind(this);\r\n this.onLoadError = this.onLoadError.bind(this);\r\n this.onHotspotsChange = this.onHotspotsChange.bind(this);\r\n this.onVrcubeInteraction = this.onVrcubeInteraction.bind(this);\r\n this.onVrobjectInteraction = this.onVrobjectInteraction.bind(this);\r\n this.options = Object.assign({ server: 'localhost', api: 'v1', fit: 'cover', image: {}, video: {}, vrcube: {}, vrobject: {}, events: {} }, options);\r\n this.options.events = Object.assign({ onLoadStart: (() => { }), onLoadProgress: (() => { }), onLoadEnd: (() => { }), onLoadError: (() => { }), onInteraction: (() => { }), onVrcubeInteraction: (() => { }), onVrobjectInteraction: (() => { }), onHotspotsChange: (() => { }) }, options.events);\r\n this.options.events.onLoadError = debounce(this.options.events.onLoadError, 10);\r\n this.container = container;\r\n this.container.classList.add('ls-viewer-container');\r\n this.containerWidth = 0;\r\n this.containerHeight = 0;\r\n this.canvas2D = new Canvas2D(this.options.fit);\r\n this.container.appendChild(this.canvas2D.element);\r\n this.canvas3D = new Canvas3D();\r\n this.container.appendChild(this.canvas3D.element);\r\n this.video = new Video();\r\n this.container.appendChild(this.video.element);\r\n this.loader = new Loader(this.options.server, this.options.api, this);\r\n this.resolution = new Resolution(0, 0);\r\n this.parameters = {\r\n width: 0,\r\n height: 0,\r\n antialiasing: false,\r\n superSampling: 2\r\n };\r\n this.encoder = {\r\n format: 'jpeg',\r\n quality: 80,\r\n };\r\n this.widgetImage = new WidgetImage(container, this.canvas2D, this.loader);\r\n this.widgetVideo = new WidgetVideo(container, this.video, this.loader);\r\n this.widgetVRCube = new WidgetVRCube(container, this.canvas3D, this.loader, this.onVrcubeInteraction);\r\n this.widgetVRObject = new WidgetVRObject(container, this.canvas2D, this.loader, this.onVrobjectInteraction);\r\n this.widget = this.widgetImage;\r\n this.isDestroyed = false;\r\n this.container.addEventListener('mousedown', this.onMouseDown);\r\n this.container.addEventListener('mouseenter', this.onMouseEnter);\r\n this.container.addEventListener('touchstart', this.onTouchStart);\r\n document.addEventListener('mousemove', this.onMouseMove, { passive: false });\r\n document.addEventListener('mouseup', this.onMouseUp);\r\n document.addEventListener('touchmove', this.onTouchMove, { passive: false });\r\n document.addEventListener('touchend', this.onTouchEnd);\r\n this.checkResize();\r\n this.loadWidget = debounce(this.loadWidget, 10);\r\n this.onResize = debounce(this.onResize, 250);\r\n }\r\n destroy() {\r\n this.canvas2D.destroy();\r\n this.container.removeEventListener('mousedown', this.onMouseDown);\r\n this.container.removeEventListener('mouseenter', this.onMouseEnter);\r\n this.container.removeEventListener('touchstart', this.onTouchStart);\r\n document.removeEventListener('mousemove', this.onMouseMove);\r\n document.removeEventListener('mouseup', this.onMouseUp);\r\n document.removeEventListener('touchmove', this.onTouchMove);\r\n document.removeEventListener('touchend', this.onTouchEnd);\r\n this.isDestroyed = true;\r\n }\r\n async load(scene, transition) {\r\n let promise = Promise.resolve();\r\n if (transition === null || transition === void 0 ? void 0 : transition.animation) {\r\n promise = promise.then(() => this.loadAnimation(transition.animation));\r\n }\r\n if (this.view && (transition === null || transition === void 0 ? void 0 : transition.fromPosition) !== undefined) {\r\n const mode = this.view.mode;\r\n promise = promise.then(() => this.viewWidget.goto(transition.fromPosition));\r\n }\r\n if (transition === null || transition === void 0 ? void 0 : transition.animation) {\r\n promise = promise.then(() => this.widgetVideo.play());\r\n }\r\n promise = promise.then(() => {\r\n this.scene = Array.isArray(scene) ? [...scene] : [scene];\r\n return this.loadWidget(false, !(transition && transition.animation));\r\n });\r\n promise.catch((e) => {\r\n this.onLoadError(e);\r\n });\r\n return promise;\r\n }\r\n async setEncoder(encoder) {\r\n this.encoder = Object.assign({}, encoder);\r\n let promise = Promise.resolve();\r\n promise = promise.then(() => this.loadWidget(false, true));\r\n promise.catch((e) => {\r\n this.onLoadError(e);\r\n });\r\n return promise;\r\n }\r\n setParameters(parameters) {\r\n this.parameters = Object.assign({}, parameters);\r\n this.parameters.width = this.resolution.width;\r\n this.parameters.height = this.resolution.height;\r\n let promise = Promise.resolve();\r\n promise = promise.then(() => this.loadWidget(false, true));\r\n promise.catch((e) => {\r\n this.onLoadError(e);\r\n });\r\n return promise;\r\n }\r\n setTags(tags) {\r\n this.tags = tags;\r\n this.loadWidget(false, false);\r\n }\r\n async setView(view, transition) {\r\n let promise = Promise.resolve();\r\n if (transition === null || transition === void 0 ? void 0 : transition.animation) {\r\n promise = promise.then(() => this.loadAnimation(transition.animation));\r\n }\r\n if (this.view && (transition === null || transition === void 0 ? void 0 : transition.fromPosition) !== undefined) {\r\n promise = promise.then(() => this.viewWidget.goto(transition.fromPosition));\r\n }\r\n if (transition === null || transition === void 0 ? void 0 : transition.animation) {\r\n promise = promise.then(() => this.widgetVideo.play());\r\n }\r\n promise = promise.then(() => {\r\n let reset = true;\r\n this.view = Object.assign({}, view);\r\n if (this.view && this.viewWidget instanceof WidgetVRObject && (transition === null || transition === void 0 ? void 0 : transition.toPosition) !== undefined) {\r\n reset = false;\r\n this.viewWidget.position = Object.assign({}, transition.toPosition);\r\n }\r\n return this.loadWidget(reset, !(transition && transition.animation));\r\n });\r\n promise.catch((e) => {\r\n this.onLoadError(e);\r\n });\r\n return promise;\r\n }\r\n setVrcube(data) {\r\n Object.assign(this.widgetVRCube, data);\r\n }\r\n setVrobject(data) {\r\n Object.assign(this.widgetVRObject, data);\r\n }\r\n async loadAnimation(animation) {\r\n var _a;\r\n const snapshot = {\r\n scene: this.scene,\r\n view: {\r\n animation: animation.name,\r\n camera: animation.camera,\r\n duration: animation.duration,\r\n loop: animation.loop,\r\n reverse: animation.reverse,\r\n },\r\n parameters: this.parameters,\r\n encoder: {\r\n format: 'mp4',\r\n },\r\n };\r\n if (!((_a = snapshot.view) === null || _a === void 0 ? void 0 : _a.background)) {\r\n snapshot.view.background = 'product';\r\n }\r\n return this.widgetVideo.load(snapshot).then(() => Promise.resolve());\r\n }\r\n async playAnimation(animation) {\r\n return this.loadAnimation(animation).then(() => this.widgetVideo.play()).catch((e) => {\r\n this.onLoadError(e);\r\n });\r\n }\r\n stopAnimation() {\r\n this.widgetVideo.hide();\r\n }\r\n snapshot(type, quality) {\r\n return this.viewWidget.snapshot(type, quality);\r\n }\r\n async loadWidget(reset, fade) {\r\n if (!this.scene || !this.view) {\r\n return Promise.resolve();\r\n }\r\n if (!this.parameters.width || !this.parameters.height) {\r\n return Promise.resolve();\r\n }\r\n const widget = this.viewWidget;\r\n if (!widget) {\r\n return Promise.reject(new Error('Unknown view mode'));\r\n }\r\n const snapshot = {\r\n scene: this.scene,\r\n view: this.view,\r\n parameters: this.parameters,\r\n encoder: this.encoder\r\n };\r\n if (!snapshot.view.background) {\r\n snapshot.view.background = 'product';\r\n }\r\n return widget.load(snapshot, this.tags || [], reset, fade).then(hotspots => {\r\n this.widget.hide();\r\n this.widget = widget;\r\n this.widget.show();\r\n this.widgetVideo.hide();\r\n this.onHotspotsChange(hotspots);\r\n });\r\n }\r\n get viewWidget() {\r\n var _a;\r\n switch ((_a = this.view) === null || _a === void 0 ? void 0 : _a.mode) {\r\n case 'image':\r\n return this.widgetImage;\r\n case 'video':\r\n return this.widgetVideo;\r\n case 'vrcube':\r\n return this.widgetVRCube;\r\n case 'vrobject':\r\n return this.widgetVRObject;\r\n default:\r\n return this.widgetImage;\r\n }\r\n }\r\n checkResize() {\r\n if (this.isDestroyed) {\r\n return;\r\n }\r\n const width = this.container.clientWidth;\r\n const height = this.container.clientHeight;\r\n if (width !== this.containerWidth || height !== this.containerHeight) {\r\n this.containerWidth = width;\r\n this.containerHeight = height;\r\n this.onResize();\r\n }\r\n if (!this.isDestroyed) {\r\n requestAnimationFrame(this.checkResize);\r\n }\r\n }\r\n onMouseDown(e) {\r\n this.widget.onMouseDown(e);\r\n }\r\n onMouseEnter(e) {\r\n this.widget.onMouseEnter(e);\r\n }\r\n onMouseMove(e) {\r\n this.widget.onMouseMove(e);\r\n }\r\n onMouseUp(e) {\r\n this.widget.onMouseUp(e);\r\n }\r\n onTouchStart(e) {\r\n this.widget.onTouchStart(e);\r\n }\r\n onTouchMove(e) {\r\n this.widget.onTouchMove(e);\r\n }\r\n onTouchEnd(e) {\r\n this.widget.onTouchEnd(e);\r\n }\r\n onDeviceOrientation(e) {\r\n this.widget.onDeviceOrientation(e);\r\n }\r\n onResize() {\r\n const pixelRatio = window.devicePixelRatio;\r\n const width = this.container.clientWidth * pixelRatio;\r\n const height = this.container.clientHeight * pixelRatio;\r\n this.resolution = Viewport.getStandardResolution(width, height);\r\n this.parameters.width = this.resolution.width;\r\n this.parameters.height = this.resolution.height;\r\n this.canvas2D.resize(width / pixelRatio, height / pixelRatio);\r\n this.canvas3D.resize(width / pixelRatio, height / pixelRatio);\r\n this.video.resize(width / pixelRatio, height / pixelRatio, this.resolution, this.options.fit);\r\n this.loadWidget(false, false).catch(e => {\r\n this.onLoadError(e);\r\n });\r\n }\r\n onVrcubeInteraction(...args) {\r\n this.options.events.onHotspotsChange(this.widgetVRCube.hotspots);\r\n this.options.events.onInteraction(...args);\r\n this.options.events.onVrcubeInteraction(...args);\r\n }\r\n onVrobjectInteraction(...args) {\r\n this.options.events.onHotspotsChange(this.widgetVRObject.hotspots);\r\n this.options.events.onInteraction(...args);\r\n this.options.events.onVrobjectInteraction(...args);\r\n }\r\n onHotspotsChange(...args) {\r\n this.options.events.onHotspotsChange(...args);\r\n }\r\n onLoadStart(...args) {\r\n this.container.classList.add('ls-viewer-container-loading');\r\n this.options.events.onLoadStart(...args);\r\n }\r\n onLoadProgress(...args) {\r\n this.options.events.onLoadProgress(...args);\r\n }\r\n onLoadEnd(...args) {\r\n this.container.classList.remove('ls-viewer-container-loading');\r\n this.options.events.onLoadEnd(...args);\r\n }\r\n onLoadError(...args) {\r\n this.container.classList.remove('ls-viewer-container-loading');\r\n this.options.events.onLoadError(...args);\r\n }\r\n}\r\n"],"names":["Canvas2D","constructor","fit","this","element","document","createElement","classList","add","style","opacity","context","getContext","backCanvas","backContext","destroy","requestAnimationId","cancelAnimationFrame","undefined","show","useDisplay","display","hide","resize","width","height","draw","img","fade","speed","drawImage","globalAlpha","fadeLoop","image","alpha","Math","min","clearRect","requestAnimationFrame","aspectRatio","canvasAspectRatio","dx","dy","Canvas3D","twgl","preserveDrawingBuffer","setDefaultTextureColor","Maths","static","v","f","factor","abs","a","PI","x","y","floor","WebRenderStatic","async","snapshot","scene","WebRenderV1","server","request","Object","entries","filter","k","map","join","_a","_b","accessory","length","find","p","decor","product","databaseId","database","configuration","animations","accessoryDatabaseId","decorDatabaseId","decorDeltaAltitude","translation","parameters","view","background","softwareAntialiasing","antialiasing","superSampling","encoder","imageFormat","format","imageQuality","quality","url","fetch","then","response","text","responseText","matches","replace","match","xmlRegex","m","Promise","reject","assign","sceneParameters","animation","bookmarkSet","camera","split","bookmark","frames","loop","renderParameters","encoderParameters","queryString","buildQuery","resolve","duration","reverse","max","WebRenderV2","pResult","s","e","t","prototype","hasOwnProperty","call","indexOf","getOwnPropertySymbols","i","propertyIsEnumerable","__rest","toString","jpeg","png","compression","webp","body","method","JSON","stringify","json","data","mode","fetchFrame","vrCube","fetchFrameArray","cameraGroup","images","vrObject","panFrames","panFrom","panTo","panLoop","tiltFrames","tiltFrom","tiltTo","tiltLoop","id","fps","tags","fetchHotspots","fetchHotspotsArray","Loader","api","delegate","webrender","loadingId","loaded","total","onLoadStart","onLoadProgress","onLoadEnd","progress","src","loadImage","video","loadVideo","srcs","promises","all","imgs","position","loadVideoFrames","loadImageFrames","Image","crossOrigin","location","protocol","isValidHttpUrl","promise","addEventListener","once","type","Array","start","n","step","ceil","index","mod","catch","load","count","seeked","removeEventListener","canvas","videoWidth","videoHeight","toDataURL","currentTime","loadVideoFrame","imageHotspots","Error","vrCubeHotspots","vrObjectHotspots","str","URL","_","Resolution","aspect","Viewport","top","left","resolution","viewportResolution","viewportRatio","getStandardAspectRatio","getStandardQuality","round","Video","setAttribute","viewport","WidgetImage","container","loader","hotspots","remove","reset","snapshotHash","loadImageSnapshot","tagsHash","loadImageHotspots","onMouseDown","onMouseMove","onMouseUp","onMouseEnter","onTouchStart","onTouchMove","onTouchEnd","onDeviceOrientation","WidgetVideo","hash","loadVideoSnapshot","play","Point","clone","EventHelper","screenX","screenY","touch","targetTouches","changedTouches","Basis3","args","u","o","w","v3","cross","localToGlobalMatrix","globalToLocalMatrix","m4","inverse","InertiaPoint","time","Inertia","onMotion","points","lastPoint","velocity","bind","animationFrameId","track","point","Date","now","push","firstPoint","dt","stop","PointOfView","target","eye","up","copy","viewVector","subtract","rightVector","normalize","viewMatrix","lookAt","default","InteractiveCamera","pov","fov","isStarted","degreesToRadians","orientationMatrix","identity","inertia","motion","initPov","initFov","initOrientation","window","orientation","startPov","startSize","previousPoint","orientedPov","headBasis","matrix","multiply","transformDirection","size","delta","accelerate","rotationMatrix","rotationY","rotationX","headMatrix","transformPoint","end","beta","gamma","alphaRadians","betaRadians","gammaRadians","rotateZ","rotateX","rotateY","WidgetVRCube","onInteraction","hotspotsList","interaction","render","gl","programInfo","createProgramInfo","quad","primitives","createXYQuadBufferInfo","uniforms","u_matrix","u_mix","u_texture_back","createTexture","TEXTURE_CUBE_MAP","minMag","LINEAR","u_texture","every","radiansToDegrees","result","flat","clientWidth","clientHeight","modelViewProjectionMatrix","forEach","hotspot","position2D","rx","ry","rz","point3D","point2D","loadVRCubeSnapshot","auto","cubeFaceOrder","TEXTURE_CUBE_MAP_POSITIVE_Z","TEXTURE_CUBE_MAP_POSITIVE_X","TEXTURE_CUBE_MAP_NEGATIVE_Z","TEXTURE_CUBE_MAP_NEGATIVE_X","TEXTURE_CUBE_MAP_POSITIVE_Y","TEXTURE_CUBE_MAP_NEGATIVE_Y","err","texture","loadVRCubeHotspots","projectionMatrixInverse","perspective","viewMatrixInverse","resizeCanvasToDisplaySize","devicePixelRatio","useProgram","program","setBuffersAndAttributes","setUniforms","drawBufferInfo","pointFromMouseEvent","preventDefault","buttons","pointFromTouchEvent","InteractivePosition","rows","initPosition","startPosition","startPoint","lastPoints","lastPointsNumber","positionIndex","splice","regressionResult","regression","linear","equation","positionX","minX","positionY","minY","WidgetVRObject","pos","goToLoop","signX","signY","loadVRObjectSnapshot","loadVRObjectHotspots","WRAPIv2","css","ref","insertAt","head","getElementsByTagName","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","Viewer","options","checkResize","onResize","onLoadError","onHotspotsChange","onVrcubeInteraction","onVrobjectInteraction","vrcube","vrobject","events","debounce","containerWidth","containerHeight","canvas2D","canvas3D","widgetImage","widgetVideo","widgetVRCube","widgetVRObject","widget","isDestroyed","passive","loadWidget","transition","loadAnimation","fromPosition","viewWidget","goto","isArray","setParameters","setTags","toPosition","setVrcube","setVrobject","name","stopAnimation","pixelRatio","getStandardResolution","SunShadowQualityMode","SunShadowSmoothnessMode","SunUseCaseMode"],"mappings":"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"}
|