@lumiscaphe/viewer 3.0.11 → 3.0.12

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.
@@ -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(/&amp;/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 fetch(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 fetchOne(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 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.fetchOne(`${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.fetch(`${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.fetch(`${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.fetch(`${this.server}/Snapshot`, 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));\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));\r\n return promises;\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 }\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, reset, fade) {\r\n const hash = JSON.stringify(snapshot);\r\n if (hash === this.hash && this.image) {\r\n this.canvas.draw(this.image, fade, 0.05);\r\n return Promise.resolve();\r\n }\r\n this.hash = hash;\r\n return this.loader.loadImageSnapshot(snapshot).then(image => {\r\n this.image = image;\r\n this.canvas.draw(this.image, fade, 0.05);\r\n });\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);\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 } 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 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 async load(snapshot, reset, fade) {\r\n const hash = JSON.stringify(snapshot);\r\n if (hash === this.hash) {\r\n this.animationFrameId = requestAnimationFrame(this.render);\r\n return Promise.resolve();\r\n }\r\n this.hash = hash;\r\n this.images = [];\r\n this.animationFrameId = requestAnimationFrame(this.render);\r\n return 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 snapshot(type, quality) {\r\n return this.canvas.element.toDataURL(type, quality);\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 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 this.uniforms.u_matrix = m4.multiply(viewMatrixInverse, projectionMatrixInverse);\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.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 async load(snapshot, reset, fade) {\r\n const hash = JSON.stringify(snapshot);\r\n if (hash === this.hash) {\r\n this.canvas.draw(this.image, fade, 0.05);\r\n return Promise.resolve();\r\n }\r\n this.hash = hash;\r\n this.images = [];\r\n if (reset) {\r\n this.interaction.reset();\r\n }\r\n const { position } = this.interaction;\r\n return 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 });\r\n });\r\n return promises[this.interaction.position];\r\n });\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.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: (() => { }) }, 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 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);\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, reset, fade).then(() => {\r\n this.widget.hide();\r\n this.widget = widget;\r\n this.widget.show();\r\n this.widgetVideo.hide();\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.onInteraction(...args);\r\n this.options.events.onVrcubeInteraction(...args);\r\n }\r\n onVrobjectInteraction(...args) {\r\n this.options.events.onInteraction(...args);\r\n this.options.events.onVrobjectInteraction(...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","fetchOne","vrCube","cameraGroup","images","vrObject","panFrames","panFrom","panTo","panLoop","tiltFrames","tiltFrom","tiltTo","tiltLoop","id","fps","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","count","seeked","removeEventListener","canvas","videoWidth","videoHeight","toDataURL","currentTime","loadVideoFrame","Video","setAttribute","WidgetImage","container","loader","remove","reset","hash","loadImageSnapshot","onMouseDown","onMouseMove","onMouseUp","onMouseEnter","onTouchStart","onTouchMove","onTouchEnd","onDeviceOrientation","WidgetVideo","loadVideoSnapshot","play","catch","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","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","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","resizeCanvasToDisplaySize","devicePixelRatio","clientWidth","clientHeight","projectionMatrixInverse","perspective","viewMatrixInverse","useProgram","program","setBuffersAndAttributes","setUniforms","drawBufferInfo","pointFromMouseEvent","preventDefault","buttons","pointFromTouchEvent","InteractivePosition","initPosition","startPosition","startPoint","WidgetVRObject","pos","goToLoop","sign","loadVRObjectSnapshot","forEach","WRAPIv2","css","ref","insertAt","head","getElementsByTagName","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","Viewer","options","checkResize","onResize","onLoadError","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","toPosition","setVrcube","setVrobject","name","stopAnimation","Error","pixelRatio","getStandardResolution","SunShadowQualityMode","SunShadowSmoothnessMode","SunUseCaseMode"],"mappings":"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"}
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(/&amp;/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 fetch(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 fetchOne(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 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.fetchOne(`${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.fetch(`${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.fetch(`${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.fetch(`${this.server}/Snapshot`, 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 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 }\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, reset, fade) {\r\n const hash = JSON.stringify(snapshot);\r\n if (hash === this.hash && this.image) {\r\n this.canvas.draw(this.image, fade, 0.05);\r\n return Promise.resolve();\r\n }\r\n this.hash = hash;\r\n return this.loader.loadImageSnapshot(snapshot).then(image => {\r\n this.image = image;\r\n this.canvas.draw(this.image, fade, 0.05);\r\n });\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);\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 } 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 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 async load(snapshot, reset, fade) {\r\n const hash = JSON.stringify(snapshot);\r\n if (hash === this.hash) {\r\n this.animationFrameId = requestAnimationFrame(this.render);\r\n return Promise.resolve();\r\n }\r\n this.hash = hash;\r\n this.images = [];\r\n this.animationFrameId = requestAnimationFrame(this.render);\r\n return 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 snapshot(type, quality) {\r\n return this.canvas.element.toDataURL(type, quality);\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 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 this.uniforms.u_matrix = m4.multiply(viewMatrixInverse, projectionMatrixInverse);\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.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 async load(snapshot, reset, fade) {\r\n const hash = JSON.stringify(snapshot);\r\n if (hash === this.hash) {\r\n this.canvas.draw(this.image, fade, 0.05);\r\n return Promise.resolve();\r\n }\r\n this.hash = hash;\r\n this.images = [];\r\n if (reset) {\r\n this.interaction.reset();\r\n }\r\n const { position } = this.interaction;\r\n return 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];\r\n });\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.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: (() => { }) }, 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 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);\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, reset, fade).then(() => {\r\n this.widget.hide();\r\n this.widget = widget;\r\n this.widget.show();\r\n this.widgetVideo.hide();\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.onInteraction(...args);\r\n this.options.events.onVrcubeInteraction(...args);\r\n }\r\n onVrobjectInteraction(...args) {\r\n this.options.events.onInteraction(...args);\r\n this.options.events.onVrobjectInteraction(...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","fetchOne","vrCube","cameraGroup","images","vrObject","panFrames","panFrom","panTo","panLoop","tiltFrames","tiltFrom","tiltTo","tiltLoop","id","fps","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","Video","setAttribute","WidgetImage","container","loader","remove","reset","hash","loadImageSnapshot","onMouseDown","onMouseMove","onMouseUp","onMouseEnter","onTouchStart","onTouchMove","onTouchEnd","onDeviceOrientation","WidgetVideo","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","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","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","resizeCanvasToDisplaySize","devicePixelRatio","clientWidth","clientHeight","projectionMatrixInverse","perspective","viewMatrixInverse","useProgram","program","setBuffersAndAttributes","setUniforms","drawBufferInfo","pointFromMouseEvent","preventDefault","buttons","pointFromTouchEvent","InteractivePosition","initPosition","startPosition","startPoint","WidgetVRObject","pos","goToLoop","sign","loadVRObjectSnapshot","forEach","WRAPIv2","css","ref","insertAt","head","getElementsByTagName","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","Viewer","options","checkResize","onResize","onLoadError","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","toPosition","setVrcube","setVrobject","name","stopAnimation","Error","pixelRatio","getStandardResolution","SunShadowQualityMode","SunShadowSmoothnessMode","SunUseCaseMode"],"mappings":"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"}