@lumiscaphe/ng-viewer 4.0.0 → 4.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/ng-viewer.component.mjs +62 -11
- package/esm2020/lib/ng-viewer.module.mjs +11 -6
- package/esm2020/lib/viewport.mjs +72 -0
- package/fesm2015/lumiscaphe-ng-viewer.mjs +143 -15
- package/fesm2015/lumiscaphe-ng-viewer.mjs.map +1 -1
- package/fesm2020/lumiscaphe-ng-viewer.mjs +141 -15
- package/fesm2020/lumiscaphe-ng-viewer.mjs.map +1 -1
- package/lib/ng-viewer.component.d.ts +28 -5
- package/lib/ng-viewer.module.d.ts +2 -1
- package/lib/viewport.d.ts +15 -0
- package/package.json +2 -2
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, ViewChild, Output } from '@angular/core';
|
|
1
|
+
import { Component, EventEmitter, Input, ViewChild, Output, HostListener } from '@angular/core';
|
|
2
2
|
import { Viewer } from '@lumiscaphe/viewer';
|
|
3
|
+
import Viewport from './viewport';
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/common";
|
|
4
6
|
export class NgViewerComponent {
|
|
5
7
|
constructor() {
|
|
8
|
+
this.hotspots = [];
|
|
9
|
+
this.hotspotTemplateRef = null;
|
|
6
10
|
this.onLoadStart = new EventEmitter();
|
|
7
11
|
this.onLoadProgress = new EventEmitter();
|
|
8
12
|
this.onLoadEnd = new EventEmitter();
|
|
@@ -10,6 +14,9 @@ export class NgViewerComponent {
|
|
|
10
14
|
this.onInteraction = new EventEmitter();
|
|
11
15
|
this.onVrcubeInteraction = new EventEmitter();
|
|
12
16
|
this.onVrobjectInteraction = new EventEmitter();
|
|
17
|
+
this.fitPosition = { width: 1, height: 1, top: 1, left: 1 };
|
|
18
|
+
this.scaleX = 1;
|
|
19
|
+
this.scaleY = 1;
|
|
13
20
|
}
|
|
14
21
|
ngAfterViewInit() {
|
|
15
22
|
this.viewer = new Viewer(this.container.nativeElement, {
|
|
@@ -24,6 +31,7 @@ export class NgViewerComponent {
|
|
|
24
31
|
onInteraction: (...args) => { this.onInteraction.emit(...args); },
|
|
25
32
|
onVrcubeInteraction: (...args) => { this.onVrcubeInteraction.emit(...args); },
|
|
26
33
|
onVrobjectInteraction: (...args) => { this.onVrobjectInteraction.emit(...args); },
|
|
34
|
+
onHotspotsChange: this.onHotspotsChange.bind(this)
|
|
27
35
|
},
|
|
28
36
|
});
|
|
29
37
|
if (this['scene']) {
|
|
@@ -44,6 +52,13 @@ export class NgViewerComponent {
|
|
|
44
52
|
if (this.vrobject) {
|
|
45
53
|
this.viewer.setVrobject(this.vrobject);
|
|
46
54
|
}
|
|
55
|
+
if (this.tags) {
|
|
56
|
+
this.viewer.setTags(this.tags);
|
|
57
|
+
}
|
|
58
|
+
this.onResize();
|
|
59
|
+
}
|
|
60
|
+
ngOnDestroy() {
|
|
61
|
+
this.viewer?.destroy();
|
|
47
62
|
}
|
|
48
63
|
ngOnChanges(changes) {
|
|
49
64
|
if (!this.viewer) {
|
|
@@ -58,6 +73,9 @@ export class NgViewerComponent {
|
|
|
58
73
|
if (changes['parameters'] && changes['parameters'].currentValue) {
|
|
59
74
|
this.viewer.setParameters(changes['parameters'].currentValue).catch(() => { });
|
|
60
75
|
}
|
|
76
|
+
if (changes['tags'] && changes['tags'].currentValue) {
|
|
77
|
+
this.viewer.setTags(changes['tags'].currentValue);
|
|
78
|
+
}
|
|
61
79
|
if (changes['view'] && changes['view'].currentValue) {
|
|
62
80
|
this.viewer.setView(changes['view'].currentValue).catch(() => { });
|
|
63
81
|
}
|
|
@@ -68,20 +86,44 @@ export class NgViewerComponent {
|
|
|
68
86
|
this.viewer.setVrobject(changes['vrobject'].currentValue);
|
|
69
87
|
}
|
|
70
88
|
}
|
|
89
|
+
onHotspotsChange(hotspots) {
|
|
90
|
+
this.hotspots = hotspots;
|
|
91
|
+
if (this.hotspotsFilter !== undefined) {
|
|
92
|
+
this.hotspots = this.hotspotsFilter(this.hotspots);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
71
95
|
snapshot(type, quality) {
|
|
72
96
|
return this.viewer?.snapshot(type, quality);
|
|
73
97
|
}
|
|
98
|
+
onResize() {
|
|
99
|
+
this.resolution = Viewport.getStandardResolution(window.innerWidth, window.innerHeight);
|
|
100
|
+
this.fitPosition = Viewport.fit(this.resolution, window.innerWidth, window.innerHeight, 'cover');
|
|
101
|
+
this.scaleX = this.fitPosition.width / this.resolution.width;
|
|
102
|
+
this.scaleY = this.fitPosition.height / this.resolution.height;
|
|
103
|
+
}
|
|
104
|
+
hotspotStyle(hotspot) {
|
|
105
|
+
if (this.view?.mode === 'vrcube') {
|
|
106
|
+
return {
|
|
107
|
+
position: 'absolute',
|
|
108
|
+
top: hotspot.position2D.y + 'px',
|
|
109
|
+
left: hotspot.position2D.x + 'px'
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
return {
|
|
114
|
+
position: 'absolute',
|
|
115
|
+
top: (hotspot.position2D.y * this.scaleY + this.fitPosition.top) + 'px',
|
|
116
|
+
left: (hotspot.position2D.x * this.scaleX + this.fitPosition.left) + 'px'
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
74
120
|
}
|
|
75
|
-
NgViewerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.
|
|
76
|
-
NgViewerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.
|
|
77
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.
|
|
121
|
+
NgViewerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgViewerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
122
|
+
NgViewerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: NgViewerComponent, selector: "NgViewer", inputs: { server: "server", api: "api", fit: "fit", scene: "scene", encoder: "encoder", parameters: "parameters", view: "view", vrcube: "vrcube", vrobject: "vrobject", tags: "tags", hotspotTemplateRef: "hotspotTemplateRef", hotspotsFilter: "hotspotsFilter" }, outputs: { onLoadStart: "onLoadStart", onLoadProgress: "onLoadProgress", onLoadEnd: "onLoadEnd", onLoadError: "onLoadError", onInteraction: "onInteraction", onVrcubeInteraction: "onVrcubeInteraction", onVrobjectInteraction: "onVrobjectInteraction" }, host: { listeners: { "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #container></div>\n\n<div class=\"position-absolute w-100 h-100\" style=\"pointer-events: none;\" *ngIf=\"hotspots.length\">\n <div [ngStyle]=\"hotspotStyle(hotspot)\" *ngFor=\"let hotspot of hotspots\">\n <ng-container *ngTemplateOutlet=\"hotspotTemplateRef; context:{hotspot: hotspot}\"></ng-container>\n </div>\n</div>", styles: [":host{display:flex;flex:1 0 auto}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
|
|
123
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgViewerComponent, decorators: [{
|
|
78
124
|
type: Component,
|
|
79
|
-
args: [{
|
|
80
|
-
|
|
81
|
-
template: '<div #container></div>',
|
|
82
|
-
styles: [':host { display: flex; flex: 1 0 auto; }']
|
|
83
|
-
}]
|
|
84
|
-
}], ctorParameters: function () { return []; }, propDecorators: { server: [{
|
|
125
|
+
args: [{ selector: 'NgViewer', template: "<div #container></div>\n\n<div class=\"position-absolute w-100 h-100\" style=\"pointer-events: none;\" *ngIf=\"hotspots.length\">\n <div [ngStyle]=\"hotspotStyle(hotspot)\" *ngFor=\"let hotspot of hotspots\">\n <ng-container *ngTemplateOutlet=\"hotspotTemplateRef; context:{hotspot: hotspot}\"></ng-container>\n </div>\n</div>", styles: [":host{display:flex;flex:1 0 auto}\n"] }]
|
|
126
|
+
}], propDecorators: { server: [{
|
|
85
127
|
type: Input
|
|
86
128
|
}], api: [{
|
|
87
129
|
type: Input
|
|
@@ -99,6 +141,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImpor
|
|
|
99
141
|
type: Input
|
|
100
142
|
}], vrobject: [{
|
|
101
143
|
type: Input
|
|
144
|
+
}], tags: [{
|
|
145
|
+
type: Input
|
|
146
|
+
}], hotspotTemplateRef: [{
|
|
147
|
+
type: Input
|
|
148
|
+
}], hotspotsFilter: [{
|
|
149
|
+
type: Input
|
|
102
150
|
}], onLoadStart: [{
|
|
103
151
|
type: Output
|
|
104
152
|
}], onLoadProgress: [{
|
|
@@ -116,5 +164,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImpor
|
|
|
116
164
|
}], container: [{
|
|
117
165
|
type: ViewChild,
|
|
118
166
|
args: ['container']
|
|
167
|
+
}], onResize: [{
|
|
168
|
+
type: HostListener,
|
|
169
|
+
args: ['window:resize', ['$event']]
|
|
119
170
|
}] } });
|
|
120
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdmlld2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXZpZXdlci9zcmMvbGliL25nLXZpZXdlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBNEIsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2SSxPQUFPLEVBQW9DLE1BQU0sRUFBZ0MsTUFBTSxvQkFBb0IsQ0FBQzs7QUFRNUcsTUFBTSxPQUFPLGlCQUFpQjtJQXdCNUI7UUFWVSxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakMsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3BDLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQy9CLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbkMsd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN6QywwQkFBcUIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBS3JELENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRTtZQUNyRCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSTtZQUNyQixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPO1lBQ3hCLE1BQU0sRUFBRTtnQkFDTixXQUFXLEVBQUUsQ0FBQyxHQUFHLElBQVcsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENB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cEdVLGlCQUFpQjtrR0FBakIsaUJBQWlCLGtsQkFKbEIsd0JBQXdCOzJGQUl2QixpQkFBaUI7a0JBTjdCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLFFBQVEsRUFBRSx3QkFBd0I7b0JBQ2xDLE1BQU0sRUFBRSxDQUFDLDBDQUEwQyxDQUFDO2lCQUNyRDswRUFNVSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUVpQixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRW5jb2RlciwgUGFyYW1ldGVycywgU2NlbmUsIFZpZXcsIFZpZXdlciwgV2lkZ2V0VlJDdWJlLCBXaWRnZXRWUk9iamVjdCB9IGZyb20gJ0BsdW1pc2NhcGhlL3ZpZXdlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ05nVmlld2VyJyxcbiAgdGVtcGxhdGU6ICc8ZGl2ICNjb250YWluZXI+PC9kaXY+JyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogZmxleDsgZmxleDogMSAwIGF1dG87IH0nXVxufSlcblxuZXhwb3J0IGNsYXNzIE5nVmlld2VyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcblxuICBwdWJsaWMgdmlld2VyOiBWaWV3ZXIgfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KCkgc2VydmVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIGFwaTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBmaXQ6ICdjb250YWluJyB8ICdjb3ZlcicgfCAnZmlsbCcgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIHNjZW5lOiBTY2VuZSB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgZW5jb2RlcjogRW5jb2RlciB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgcGFyYW1ldGVyczogUGFyYW1ldGVycyB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgdmlldzogVmlldyB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgdnJjdWJlOiBQYXJ0aWFsPFdpZGdldFZSQ3ViZT4gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIHZyb2JqZWN0OiBQYXJ0aWFsPFdpZGdldFZST2JqZWN0PiB8IHVuZGVmaW5lZDtcblxuICBAT3V0cHV0KCkgb25Mb2FkU3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvbkxvYWRQcm9ncmVzcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uTG9hZEVuZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uTG9hZEVycm9yID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25JbnRlcmFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uVnJjdWJlSW50ZXJhY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvblZyb2JqZWN0SW50ZXJhY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJykgY29udGFpbmVyITogRWxlbWVudFJlZjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnZpZXdlciA9IG5ldyBWaWV3ZXIodGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudCwge1xuICAgICAgc2VydmVyOiB0aGlzLnNlcnZlcixcbiAgICAgIGFwaTogdGhpcy5hcGkgfHwgJ3YxJyxcbiAgICAgIGZpdDogdGhpcy5maXQgfHwgJ2NvdmVyJyxcbiAgICAgIGV2ZW50czoge1xuICAgICAgICBvbkxvYWRTdGFydDogKC4uLmFyZ3M6IGFueVtdKSA9PiB7IHRoaXMub25Mb2FkU3RhcnQuZW1pdCguLi5hcmdzKTsgfSxcbiAgICAgICAgb25Mb2FkUHJvZ3Jlc3M6ICguLi5hcmdzOiBhbnlbXSkgPT4geyB0aGlzLm9uTG9hZFByb2dyZXNzLmVtaXQoLi4uYXJncyk7IH0sXG4gICAgICAgIG9uTG9hZEVuZDogKC4uLmFyZ3M6IGFueVtdKSA9PiB7IHRoaXMub25Mb2FkRW5kLmVtaXQoLi4uYXJncyk7IH0sXG4gICAgICAgIG9uTG9hZEVycm9yOiAoLi4uYXJnczogYW55W10pID0+IHsgdGhpcy5vbkxvYWRFcnJvci5lbWl0KC4uLmFyZ3MpOyB9LFxuICAgICAgICBvbkludGVyYWN0aW9uOiAoLi4uYXJnczogYW55W10pID0+IHsgdGhpcy5vbkludGVyYWN0aW9uLmVtaXQoLi4uYXJncyk7IH0sXG4gICAgICAgIG9uVnJjdWJlSW50ZXJhY3Rpb246ICguLi5hcmdzOiBhbnlbXSkgPT4geyB0aGlzLm9uVnJjdWJlSW50ZXJhY3Rpb24uZW1pdCguLi5hcmdzKTsgfSxcbiAgICAgICAgb25Wcm9iamVjdEludGVyYWN0aW9uOiAoLi4uYXJnczogYW55W10pID0+IHsgdGhpcy5vblZyb2JqZWN0SW50ZXJhY3Rpb24uZW1pdCguLi5hcmdzKTsgfSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAodGhpc1snc2NlbmUnXSkge1xuICAgICAgdGhpcy52aWV3ZXIubG9hZCh0aGlzLnNjZW5lKS5jYXRjaCgoKSA9PiB7IH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzWydlbmNvZGVyJ10pIHtcbiAgICAgIHRoaXMudmlld2VyLnNldEVuY29kZXIodGhpcy5lbmNvZGVyKS5jYXRjaCgoKSA9PiB7IH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBhcmFtZXRlcnMpIHtcbiAgICAgIHRoaXMudmlld2VyLnNldFBhcmFtZXRlcnModGhpcy5wYXJhbWV0ZXJzKS5jYXRjaCgoKSA9PiB7IH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZpZXcpIHtcbiAgICAgIHRoaXMudmlld2VyLnNldFZpZXcodGhpcy52aWV3KS5jYXRjaCgoKSA9PiB7IH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZyY3ViZSkge1xuICAgICAgdGhpcy52aWV3ZXIuc2V0VnJjdWJlKHRoaXMudnJjdWJlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy52cm9iamVjdCkge1xuICAgICAgdGhpcy52aWV3ZXIuc2V0VnJvYmplY3QodGhpcy52cm9iamVjdCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snc2NlbmUnXSAmJiBjaGFuZ2VzWydzY2VuZSddLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy52aWV3ZXIubG9hZChjaGFuZ2VzWydzY2VuZSddLmN1cnJlbnRWYWx1ZSkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snZW5jb2RlciddICYmIGNoYW5nZXNbJ2VuY29kZXInXS5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMudmlld2VyLnNldEVuY29kZXIoY2hhbmdlc1snZW5jb2RlciddLmN1cnJlbnRWYWx1ZSkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1sncGFyYW1ldGVycyddICYmIGNoYW5nZXNbJ3BhcmFtZXRlcnMnXS5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMudmlld2VyLnNldFBhcmFtZXRlcnMoY2hhbmdlc1sncGFyYW1ldGVycyddLmN1cnJlbnRWYWx1ZSkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1sndmlldyddICYmIGNoYW5nZXNbJ3ZpZXcnXS5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMudmlld2VyLnNldFZpZXcoY2hhbmdlc1sndmlldyddLmN1cnJlbnRWYWx1ZSkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1sndnJjdWJlJ10gJiYgY2hhbmdlc1sndnJjdWJlJ10uY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLnZpZXdlci5zZXRWcmN1YmUoY2hhbmdlc1sndnJjdWJlJ10uY3VycmVudFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1sndnJvYmplY3QnXSAmJiBjaGFuZ2VzWyd2cm9iamVjdCddLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy52aWV3ZXIuc2V0VnJvYmplY3QoY2hhbmdlc1sndnJvYmplY3QnXS5jdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHNuYXBzaG90KHR5cGU6IHN0cmluZywgcXVhbGl0eTogbnVtYmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy52aWV3ZXI/LnNuYXBzaG90KHR5cGUsIHF1YWxpdHkpO1xuICB9XG5cbn1cbiJdfQ==
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdmlld2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXZpZXdlci9zcmMvbGliL25nLXZpZXdlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy12aWV3ZXIvc3JjL2xpYi9uZy12aWV3ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBdUMsU0FBUyxFQUFFLE1BQU0sRUFBZSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0ssT0FBTyxFQUE2QyxNQUFNLEVBQWdDLE1BQU0sb0JBQW9CLENBQUM7QUFDckgsT0FBTyxRQUFRLE1BQU0sWUFBWSxDQUFDOzs7QUFRbEMsTUFBTSxPQUFPLGlCQUFpQjtJQU45QjtRQVVTLGFBQVEsR0FBYyxFQUFFLENBQUM7UUFZdkIsdUJBQWtCLEdBQTRCLElBQUksQ0FBQztRQUdsRCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakMsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3BDLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQy9CLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbkMsd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN6QywwQkFBcUIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBc0c5QyxnQkFBVyxHQUFpRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUVySCxXQUFNLEdBQVcsQ0FBQyxDQUFDO1FBQ25CLFdBQU0sR0FBVyxDQUFDLENBQUM7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Q0FBQztTQUNIO0lBQ0gsQ0FBQzs7OEdBMUpVLGlCQUFpQjtrR0FBakIsaUJBQWlCLDB1QkNYOUIsNlVBTU07MkZES08saUJBQWlCO2tCQU43QixTQUFTOytCQUNFLFVBQVU7OEJBV1gsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBRWlCLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkEwR2YsUUFBUTtzQkFEZCxZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEVuY29kZXIsIEhvdHNwb3QsIFBhcmFtZXRlcnMsIFNjZW5lLCBWaWV3LCBWaWV3ZXIsIFdpZGdldFZSQ3ViZSwgV2lkZ2V0VlJPYmplY3QgfSBmcm9tICdAbHVtaXNjYXBoZS92aWV3ZXInO1xuaW1wb3J0IFZpZXdwb3J0IGZyb20gJy4vdmlld3BvcnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdOZ1ZpZXdlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZy12aWV3ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9uZy12aWV3ZXIuY29tcG9uZW50LnNjc3MnXVxufSlcblxuZXhwb3J0IGNsYXNzIE5nVmlld2VyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuXG4gIHB1YmxpYyB2aWV3ZXI6IFZpZXdlciB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgaG90c3BvdHM6IEhvdHNwb3RbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIHNlcnZlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBhcGk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgZml0OiAnY29udGFpbicgfCAnY292ZXInIHwgJ2ZpbGwnIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBzY2VuZTogU2NlbmUgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIGVuY29kZXI6IEVuY29kZXIgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIHBhcmFtZXRlcnM6IFBhcmFtZXRlcnMgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIHZpZXc6IFZpZXcgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIHZyY3ViZTogUGFydGlhbDxXaWRnZXRWUkN1YmU+IHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSB2cm9iamVjdDogUGFydGlhbDxXaWRnZXRWUk9iamVjdD4gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIHRhZ3M6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBob3RzcG90VGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgaG90c3BvdHNGaWx0ZXI6ICgoaG90c3BvdHM6IEhvdHNwb3RbXSkgPT4gSG90c3BvdFtdKSB8IHVuZGVmaW5lZDtcblxuICBAT3V0cHV0KCkgb25Mb2FkU3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvbkxvYWRQcm9ncmVzcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uTG9hZEVuZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uTG9hZEVycm9yID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25JbnRlcmFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uVnJjdWJlSW50ZXJhY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvblZyb2JqZWN0SW50ZXJhY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJykgY29udGFpbmVyITogRWxlbWVudFJlZjtcblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy52aWV3ZXIgPSBuZXcgVmlld2VyKHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsIHtcbiAgICAgIHNlcnZlcjogdGhpcy5zZXJ2ZXIsXG4gICAgICBhcGk6IHRoaXMuYXBpIHx8ICd2MScsXG4gICAgICBmaXQ6IHRoaXMuZml0IHx8ICdjb3ZlcicsXG4gICAgICBldmVudHM6IHtcbiAgICAgICAgb25Mb2FkU3RhcnQ6ICguLi5hcmdzOiBhbnlbXSkgPT4geyB0aGlzLm9uTG9hZFN0YXJ0LmVtaXQoLi4uYXJncyk7IH0sXG4gICAgICAgIG9uTG9hZFByb2dyZXNzOiAoLi4uYXJnczogYW55W10pID0+IHsgdGhpcy5vbkxvYWRQcm9ncmVzcy5lbWl0KC4uLmFyZ3MpOyB9LFxuICAgICAgICBvbkxvYWRFbmQ6ICguLi5hcmdzOiBhbnlbXSkgPT4geyB0aGlzLm9uTG9hZEVuZC5lbWl0KC4uLmFyZ3MpOyB9LFxuICAgICAgICBvbkxvYWRFcnJvcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB7IHRoaXMub25Mb2FkRXJyb3IuZW1pdCguLi5hcmdzKTsgfSxcbiAgICAgICAgb25JbnRlcmFjdGlvbjogKC4uLmFyZ3M6IGFueVtdKSA9PiB7IHRoaXMub25JbnRlcmFjdGlvbi5lbWl0KC4uLmFyZ3MpOyB9LFxuICAgICAgICBvblZyY3ViZUludGVyYWN0aW9uOiAoLi4uYXJnczogYW55W10pID0+IHsgdGhpcy5vblZyY3ViZUludGVyYWN0aW9uLmVtaXQoLi4uYXJncyk7IH0sXG4gICAgICAgIG9uVnJvYmplY3RJbnRlcmFjdGlvbjogKC4uLmFyZ3M6IGFueVtdKSA9PiB7IHRoaXMub25Wcm9iamVjdEludGVyYWN0aW9uLmVtaXQoLi4uYXJncyk7IH0sXG4gICAgICAgIG9uSG90c3BvdHNDaGFuZ2U6IHRoaXMub25Ib3RzcG90c0NoYW5nZS5iaW5kKHRoaXMpXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXNbJ3NjZW5lJ10pIHtcbiAgICAgIHRoaXMudmlld2VyLmxvYWQodGhpcy5zY2VuZSkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpc1snZW5jb2RlciddKSB7XG4gICAgICB0aGlzLnZpZXdlci5zZXRFbmNvZGVyKHRoaXMuZW5jb2RlcikuY2F0Y2goKCkgPT4geyB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wYXJhbWV0ZXJzKSB7XG4gICAgICB0aGlzLnZpZXdlci5zZXRQYXJhbWV0ZXJzKHRoaXMucGFyYW1ldGVycykuY2F0Y2goKCkgPT4geyB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy52aWV3KSB7XG4gICAgICB0aGlzLnZpZXdlci5zZXRWaWV3KHRoaXMudmlldykuY2F0Y2goKCkgPT4geyB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy52cmN1YmUpIHtcbiAgICAgIHRoaXMudmlld2VyLnNldFZyY3ViZSh0aGlzLnZyY3ViZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudnJvYmplY3QpIHtcbiAgICAgIHRoaXMudmlld2VyLnNldFZyb2JqZWN0KHRoaXMudnJvYmplY3QpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRhZ3MpIHtcbiAgICAgIHRoaXMudmlld2VyLnNldFRhZ3ModGhpcy50YWdzKTtcbiAgICB9XG5cbiAgICB0aGlzLm9uUmVzaXplKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8uZGVzdHJveSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snc2NlbmUnXSAmJiBjaGFuZ2VzWydzY2VuZSddLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy52aWV3ZXIubG9hZChjaGFuZ2VzWydzY2VuZSddLmN1cnJlbnRWYWx1ZSkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snZW5jb2RlciddICYmIGNoYW5nZXNbJ2VuY29kZXInXS5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMudmlld2VyLnNldEVuY29kZXIoY2hhbmdlc1snZW5jb2RlciddLmN1cnJlbnRWYWx1ZSkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1sncGFyYW1ldGVycyddICYmIGNoYW5nZXNbJ3BhcmFtZXRlcnMnXS5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMudmlld2VyLnNldFBhcmFtZXRlcnMoY2hhbmdlc1sncGFyYW1ldGVycyddLmN1cnJlbnRWYWx1ZSkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1sndGFncyddICYmIGNoYW5nZXNbJ3RhZ3MnXS5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMudmlld2VyLnNldFRhZ3MoY2hhbmdlc1sndGFncyddLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ3ZpZXcnXSAmJiBjaGFuZ2VzWyd2aWV3J10uY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLnZpZXdlci5zZXRWaWV3KGNoYW5nZXNbJ3ZpZXcnXS5jdXJyZW50VmFsdWUpLmNhdGNoKCgpID0+IHsgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ3ZyY3ViZSddICYmIGNoYW5nZXNbJ3ZyY3ViZSddLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy52aWV3ZXIuc2V0VnJjdWJlKGNoYW5nZXNbJ3ZyY3ViZSddLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ3Zyb2JqZWN0J10gJiYgY2hhbmdlc1sndnJvYmplY3QnXS5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMudmlld2VyLnNldFZyb2JqZWN0KGNoYW5nZXNbJ3Zyb2JqZWN0J10uY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBvbkhvdHNwb3RzQ2hhbmdlKGhvdHNwb3RzOiBIb3RzcG90W10pOiB2b2lkIHtcbiAgICB0aGlzLmhvdHNwb3RzID0gaG90c3BvdHM7XG5cbiAgICBpZiAodGhpcy5ob3RzcG90c0ZpbHRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmhvdHNwb3RzID0gdGhpcy5ob3RzcG90c0ZpbHRlcih0aGlzLmhvdHNwb3RzKTtcbiAgICB9XG4gIH1cblxuICBzbmFwc2hvdCh0eXBlOiBzdHJpbmcsIHF1YWxpdHk6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudmlld2VyPy5zbmFwc2hvdCh0eXBlLCBxdWFsaXR5KTtcbiAgfVxuXG4gIHB1YmxpYyBmaXRQb3NpdGlvbjogeyB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgdG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlciB9ID0geyB3aWR0aDogMSwgaGVpZ2h0OiAxLCB0b3A6IDEsIGxlZnQ6IDEgfTtcbiAgcHVibGljIHJlc29sdXRpb246IHsgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHNjYWxlWDogbnVtYmVyID0gMTtcbiAgcHVibGljIHNjYWxlWTogbnVtYmVyID0gMTtcblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uUmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMucmVzb2x1dGlvbiA9IFZpZXdwb3J0LmdldFN0YW5kYXJkUmVzb2x1dGlvbih3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0KTtcbiAgICB0aGlzLmZpdFBvc2l0aW9uID0gVmlld3BvcnQuZml0KHRoaXMucmVzb2x1dGlvbiwgd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCwgJ2NvdmVyJyk7XG4gICAgdGhpcy5zY2FsZVggPSB0aGlzLmZpdFBvc2l0aW9uLndpZHRoIC8gdGhpcy5yZXNvbHV0aW9uLndpZHRoO1xuICAgIHRoaXMuc2NhbGVZID0gdGhpcy5maXRQb3NpdGlvbi5oZWlnaHQgLyB0aGlzLnJlc29sdXRpb24uaGVpZ2h0O1xuICB9XG5cbiAgcHVibGljIGhvdHNwb3RTdHlsZShob3RzcG90OiBIb3RzcG90KTogeyBsZWZ0OiBzdHJpbmcsIHRvcDogc3RyaW5nLCBwb3NpdGlvbjogc3RyaW5nIH0ge1xuICAgIGlmICh0aGlzLnZpZXc/Lm1vZGUgPT09ICd2cmN1YmUnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgdG9wOiBob3RzcG90LnBvc2l0aW9uMkQueSArICdweCcsXG4gICAgICAgIGxlZnQ6IGhvdHNwb3QucG9zaXRpb24yRC54ICsgJ3B4J1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHRvcDogKGhvdHNwb3QucG9zaXRpb24yRC55ICogdGhpcy5zY2FsZVkgKyB0aGlzLmZpdFBvc2l0aW9uLnRvcCkgKyAncHgnLFxuICAgICAgICBsZWZ0OiAoaG90c3BvdC5wb3NpdGlvbjJELnggKiB0aGlzLnNjYWxlWCArIHRoaXMuZml0UG9zaXRpb24ubGVmdCkgKyAncHgnXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiAjY29udGFpbmVyPjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGUgdy0xMDAgaC0xMDBcIiBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lO1wiICpuZ0lmPVwiaG90c3BvdHMubGVuZ3RoXCI+XG4gIDxkaXYgW25nU3R5bGVdPVwiaG90c3BvdFN0eWxlKGhvdHNwb3QpXCIgKm5nRm9yPVwibGV0IGhvdHNwb3Qgb2YgaG90c3BvdHNcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaG90c3BvdFRlbXBsYXRlUmVmOyBjb250ZXh0Ontob3RzcG90OiBob3RzcG90fVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
|
@@ -1,21 +1,26 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
1
2
|
import { NgModule } from '@angular/core';
|
|
2
3
|
import { NgViewerComponent } from './ng-viewer.component';
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
5
|
export class NgViewerModule {
|
|
5
6
|
}
|
|
6
|
-
NgViewerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.
|
|
7
|
-
NgViewerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.
|
|
8
|
-
NgViewerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.
|
|
9
|
-
|
|
7
|
+
NgViewerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgViewerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
8
|
+
NgViewerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgViewerModule, declarations: [NgViewerComponent], imports: [CommonModule], exports: [NgViewerComponent] });
|
|
9
|
+
NgViewerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgViewerModule, imports: [[
|
|
10
|
+
CommonModule
|
|
11
|
+
]] });
|
|
12
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgViewerModule, decorators: [{
|
|
10
13
|
type: NgModule,
|
|
11
14
|
args: [{
|
|
12
15
|
declarations: [
|
|
13
16
|
NgViewerComponent
|
|
14
17
|
],
|
|
15
|
-
imports: [
|
|
18
|
+
imports: [
|
|
19
|
+
CommonModule
|
|
20
|
+
],
|
|
16
21
|
exports: [
|
|
17
22
|
NgViewerComponent
|
|
18
23
|
]
|
|
19
24
|
}]
|
|
20
25
|
}] });
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdmlld2VyLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXZpZXdlci9zcmMvbGliL25nLXZpZXdlci5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBYzFELE1BQU0sT0FBTyxjQUFjOzsyR0FBZCxjQUFjOzRHQUFkLGNBQWMsaUJBVnZCLGlCQUFpQixhQUdqQixZQUFZLGFBR1osaUJBQWlCOzRHQUlSLGNBQWMsWUFSaEI7WUFDUCxZQUFZO1NBQ2I7MkZBTVUsY0FBYztrQkFaMUIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1osaUJBQWlCO3FCQUNsQjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTtxQkFDYjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsaUJBQWlCO3FCQUNsQjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdWaWV3ZXJDb21wb25lbnQgfSBmcm9tICcuL25nLXZpZXdlci5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBOZ1ZpZXdlckNvbXBvbmVudFxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlXG4gIF0sXG4gIGV4cG9ydHM6IFtcbiAgICBOZ1ZpZXdlckNvbXBvbmVudFxuICBdXG59KVxuXG5leHBvcnQgY2xhc3MgTmdWaWV3ZXJNb2R1bGUgeyB9XG4iXX0=
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export class Viewport {
|
|
2
|
+
static fit(resolution, viewportWidth, viewportHeight, fit) {
|
|
3
|
+
const aspectRatio = resolution.width / resolution.height;
|
|
4
|
+
const viewportRatio = viewportWidth / viewportHeight;
|
|
5
|
+
let width = 0;
|
|
6
|
+
let height = 0;
|
|
7
|
+
switch (fit) {
|
|
8
|
+
case 'contain':
|
|
9
|
+
width = viewportRatio < aspectRatio ? viewportWidth : viewportHeight * aspectRatio;
|
|
10
|
+
height = viewportRatio < aspectRatio ? viewportWidth / aspectRatio : viewportHeight;
|
|
11
|
+
break;
|
|
12
|
+
case 'cover':
|
|
13
|
+
default:
|
|
14
|
+
width = viewportRatio < aspectRatio ? viewportHeight * aspectRatio : viewportWidth;
|
|
15
|
+
height = viewportRatio < aspectRatio ? viewportHeight : viewportWidth / aspectRatio;
|
|
16
|
+
break;
|
|
17
|
+
case 'fill':
|
|
18
|
+
width = viewportWidth;
|
|
19
|
+
height = viewportHeight;
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
width: Math.round(width),
|
|
24
|
+
height: Math.round(height),
|
|
25
|
+
top: Math.round((viewportHeight - height) / 2),
|
|
26
|
+
left: Math.round((viewportWidth - width) / 2),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
static getStandardAspectRatio(width, height) {
|
|
30
|
+
if (width === 0 || height === 0) {
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
const aspectRatio = width / height;
|
|
34
|
+
if (width < height) {
|
|
35
|
+
const distanceTo34 = Math.abs(3 / 4 - aspectRatio);
|
|
36
|
+
const distanceTo916 = Math.abs(9 / 16 - aspectRatio);
|
|
37
|
+
return distanceTo34 < distanceTo916 ? 3 / 4 : 9 / 16;
|
|
38
|
+
}
|
|
39
|
+
const distanceTo43 = Math.abs(4 / 3 - aspectRatio);
|
|
40
|
+
const distanceTo169 = Math.abs(16 / 9 - aspectRatio);
|
|
41
|
+
return distanceTo43 < distanceTo169 ? 4 / 3 : 16 / 9;
|
|
42
|
+
}
|
|
43
|
+
static getStandardQuality(height) {
|
|
44
|
+
if (height <= 240) {
|
|
45
|
+
return 240;
|
|
46
|
+
}
|
|
47
|
+
if (height <= 360) {
|
|
48
|
+
return 360;
|
|
49
|
+
}
|
|
50
|
+
if (height <= 480) {
|
|
51
|
+
return 480;
|
|
52
|
+
}
|
|
53
|
+
if (height <= 720) {
|
|
54
|
+
return 720;
|
|
55
|
+
}
|
|
56
|
+
return 1080;
|
|
57
|
+
}
|
|
58
|
+
static getStandardResolution(width, height) {
|
|
59
|
+
if (width === 0 || height === 0) {
|
|
60
|
+
return { width: 0, height: 0 };
|
|
61
|
+
}
|
|
62
|
+
const aspectRatio = Viewport.getStandardAspectRatio(width, height);
|
|
63
|
+
if (width < height) {
|
|
64
|
+
const quality = Viewport.getStandardQuality(height * aspectRatio);
|
|
65
|
+
return { width: Math.round(quality), height: Math.round(quality / aspectRatio) };
|
|
66
|
+
}
|
|
67
|
+
const quality = Viewport.getStandardQuality(width / aspectRatio);
|
|
68
|
+
return { width: Math.round(quality * aspectRatio), height: Math.round(quality) };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export default Viewport;
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld3BvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy12aWV3ZXIvc3JjL2xpYi92aWV3cG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sUUFBUTtJQUNaLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBZSxFQUFFLGFBQWtCLEVBQUUsY0FBbUIsRUFBRSxHQUFRO1FBQ2xGLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUN6RCxNQUFNLGFBQWEsR0FBRyxhQUFhLEdBQUcsY0FBYyxDQUFDO1FBRXJELElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUVmLFFBQVEsR0FBRyxFQUFFO1lBQ1gsS0FBSyxTQUFTO2dCQUNaLEtBQUssR0FBRyxhQUFhLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUM7Z0JBQ25GLE1BQU0sR0FBRyxhQUFhLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7Z0JBQ3BGLE1BQU07WUFDUixLQUFLLE9BQU8sQ0FBQztZQUNiO2dCQUNFLEtBQUssR0FBRyxhQUFhLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFjLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7Z0JBQ25GLE1BQU0sR0FBRyxhQUFhLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUM7Z0JBQ3BGLE1BQU07WUFDUixLQUFLLE1BQU07Z0JBQ1QsS0FBSyxHQUFHLGFBQWEsQ0FBQztnQkFDdEIsTUFBTSxHQUFHLGNBQWMsQ0FBQztnQkFDeEIsTUFBTTtTQUNUO1FB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SSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUNuRixDQUFDO0NBQ0Y7QUFFRCxlQUFlLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBWaWV3cG9ydCB7XG4gIHB1YmxpYyBzdGF0aWMgZml0KHJlc29sdXRpb246IGFueSwgdmlld3BvcnRXaWR0aDogYW55LCB2aWV3cG9ydEhlaWdodDogYW55LCBmaXQ6IGFueSk6IHsgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHRvcDogbnVtYmVyLCBsZWZ0OiBudW1iZXIgfSB7XG4gICAgY29uc3QgYXNwZWN0UmF0aW8gPSByZXNvbHV0aW9uLndpZHRoIC8gcmVzb2x1dGlvbi5oZWlnaHQ7XG4gICAgY29uc3Qgdmlld3BvcnRSYXRpbyA9IHZpZXdwb3J0V2lkdGggLyB2aWV3cG9ydEhlaWdodDtcblxuICAgIGxldCB3aWR0aCA9IDA7XG4gICAgbGV0IGhlaWdodCA9IDA7XG5cbiAgICBzd2l0Y2ggKGZpdCkge1xuICAgICAgY2FzZSAnY29udGFpbic6XG4gICAgICAgIHdpZHRoID0gdmlld3BvcnRSYXRpbyA8IGFzcGVjdFJhdGlvID8gdmlld3BvcnRXaWR0aCA6IHZpZXdwb3J0SGVpZ2h0ICogYXNwZWN0UmF0aW87XG4gICAgICAgIGhlaWdodCA9IHZpZXdwb3J0UmF0aW8gPCBhc3BlY3RSYXRpbyA/IHZpZXdwb3J0V2lkdGggLyBhc3BlY3RSYXRpbyA6IHZpZXdwb3J0SGVpZ2h0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NvdmVyJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHdpZHRoID0gdmlld3BvcnRSYXRpbyA8IGFzcGVjdFJhdGlvID8gdmlld3BvcnRIZWlnaHQgKiBhc3BlY3RSYXRpbyA6IHZpZXdwb3J0V2lkdGg7XG4gICAgICAgIGhlaWdodCA9IHZpZXdwb3J0UmF0aW8gPCBhc3BlY3RSYXRpbyA/IHZpZXdwb3J0SGVpZ2h0IDogdmlld3BvcnRXaWR0aCAvIGFzcGVjdFJhdGlvO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ZpbGwnOlxuICAgICAgICB3aWR0aCA9IHZpZXdwb3J0V2lkdGg7XG4gICAgICAgIGhlaWdodCA9IHZpZXdwb3J0SGVpZ2h0O1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IE1hdGgucm91bmQod2lkdGgpLFxuICAgICAgaGVpZ2h0OiBNYXRoLnJvdW5kKGhlaWdodCksXG4gICAgICB0b3A6IE1hdGgucm91bmQoKHZpZXdwb3J0SGVpZ2h0IC0gaGVpZ2h0KSAvIDIpLFxuICAgICAgbGVmdDogTWF0aC5yb3VuZCgodmlld3BvcnRXaWR0aCAtIHdpZHRoKSAvIDIpLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZ2V0U3RhbmRhcmRBc3BlY3RSYXRpbyh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHdpZHRoID09PSAwIHx8IGhlaWdodCA9PT0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgYXNwZWN0UmF0aW8gPSB3aWR0aCAvIGhlaWdodDtcblxuICAgIGlmICh3aWR0aCA8IGhlaWdodCkge1xuICAgICAgY29uc3QgZGlzdGFuY2VUbzM0ID0gTWF0aC5hYnMoMyAvIDQgLSBhc3BlY3RSYXRpbyk7XG4gICAgICBjb25zdCBkaXN0YW5jZVRvOTE2ID0gTWF0aC5hYnMoOSAvIDE2IC0gYXNwZWN0UmF0aW8pO1xuICAgICAgcmV0dXJuIGRpc3RhbmNlVG8zNCA8IGRpc3RhbmNlVG85MTYgPyAzIC8gNCA6IDkgLyAxNjtcbiAgICB9XG5cbiAgICBjb25zdCBkaXN0YW5jZVRvNDMgPSBNYXRoLmFicyg0IC8gMyAtIGFzcGVjdFJhdGlvKTtcbiAgICBjb25zdCBkaXN0YW5jZVRvMTY5ID0gTWF0aC5hYnMoMTYgLyA5IC0gYXNwZWN0UmF0aW8pO1xuXG4gICAgcmV0dXJuIGRpc3RhbmNlVG80MyA8IGRpc3RhbmNlVG8xNjkgPyA0IC8gMyA6IDE2IC8gOTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRTdGFuZGFyZFF1YWxpdHkoaGVpZ2h0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmIChoZWlnaHQgPD0gMjQwKSB7XG4gICAgICByZXR1cm4gMjQwO1xuICAgIH1cblxuICAgIGlmIChoZWlnaHQgPD0gMzYwKSB7XG4gICAgICByZXR1cm4gMzYwO1xuICAgIH1cblxuICAgIGlmIChoZWlnaHQgPD0gNDgwKSB7XG4gICAgICByZXR1cm4gNDgwO1xuICAgIH1cblxuICAgIGlmIChoZWlnaHQgPD0gNzIwKSB7XG4gICAgICByZXR1cm4gNzIwO1xuICAgIH1cblxuICAgIHJldHVybiAxMDgwO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRTdGFuZGFyZFJlc29sdXRpb24od2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB7IHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyIH0ge1xuICAgIGlmICh3aWR0aCA9PT0gMCB8fCBoZWlnaHQgPT09IDApIHtcbiAgICAgIHJldHVybiB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBhc3BlY3RSYXRpbyA9IFZpZXdwb3J0LmdldFN0YW5kYXJkQXNwZWN0UmF0aW8od2lkdGgsIGhlaWdodCk7XG5cbiAgICBpZiAod2lkdGggPCBoZWlnaHQpIHtcbiAgICAgIGNvbnN0IHF1YWxpdHkgPSBWaWV3cG9ydC5nZXRTdGFuZGFyZFF1YWxpdHkoaGVpZ2h0ICogYXNwZWN0UmF0aW8pO1xuICAgICAgcmV0dXJuIHsgd2lkdGg6IE1hdGgucm91bmQocXVhbGl0eSksIGhlaWdodDogTWF0aC5yb3VuZChxdWFsaXR5IC8gYXNwZWN0UmF0aW8pIH07XG4gICAgfVxuXG4gICAgY29uc3QgcXVhbGl0eSA9IFZpZXdwb3J0LmdldFN0YW5kYXJkUXVhbGl0eSh3aWR0aCAvIGFzcGVjdFJhdGlvKTtcbiAgICByZXR1cm4geyB3aWR0aDogTWF0aC5yb3VuZChxdWFsaXR5ICogYXNwZWN0UmF0aW8pLCBoZWlnaHQ6IE1hdGgucm91bmQocXVhbGl0eSkgfTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBWaWV3cG9ydDtcbiJdfQ==
|
|
@@ -1,9 +1,84 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { EventEmitter, Component, Input, Output, ViewChild, NgModule } from '@angular/core';
|
|
2
|
+
import { EventEmitter, Component, Input, Output, ViewChild, HostListener, NgModule } from '@angular/core';
|
|
3
3
|
import { Viewer } from '@lumiscaphe/viewer';
|
|
4
|
+
import * as i1 from '@angular/common';
|
|
5
|
+
import { CommonModule } from '@angular/common';
|
|
6
|
+
|
|
7
|
+
class Viewport {
|
|
8
|
+
static fit(resolution, viewportWidth, viewportHeight, fit) {
|
|
9
|
+
const aspectRatio = resolution.width / resolution.height;
|
|
10
|
+
const viewportRatio = viewportWidth / viewportHeight;
|
|
11
|
+
let width = 0;
|
|
12
|
+
let height = 0;
|
|
13
|
+
switch (fit) {
|
|
14
|
+
case 'contain':
|
|
15
|
+
width = viewportRatio < aspectRatio ? viewportWidth : viewportHeight * aspectRatio;
|
|
16
|
+
height = viewportRatio < aspectRatio ? viewportWidth / aspectRatio : viewportHeight;
|
|
17
|
+
break;
|
|
18
|
+
case 'cover':
|
|
19
|
+
default:
|
|
20
|
+
width = viewportRatio < aspectRatio ? viewportHeight * aspectRatio : viewportWidth;
|
|
21
|
+
height = viewportRatio < aspectRatio ? viewportHeight : viewportWidth / aspectRatio;
|
|
22
|
+
break;
|
|
23
|
+
case 'fill':
|
|
24
|
+
width = viewportWidth;
|
|
25
|
+
height = viewportHeight;
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
width: Math.round(width),
|
|
30
|
+
height: Math.round(height),
|
|
31
|
+
top: Math.round((viewportHeight - height) / 2),
|
|
32
|
+
left: Math.round((viewportWidth - width) / 2),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
static getStandardAspectRatio(width, height) {
|
|
36
|
+
if (width === 0 || height === 0) {
|
|
37
|
+
return 0;
|
|
38
|
+
}
|
|
39
|
+
const aspectRatio = width / height;
|
|
40
|
+
if (width < height) {
|
|
41
|
+
const distanceTo34 = Math.abs(3 / 4 - aspectRatio);
|
|
42
|
+
const distanceTo916 = Math.abs(9 / 16 - aspectRatio);
|
|
43
|
+
return distanceTo34 < distanceTo916 ? 3 / 4 : 9 / 16;
|
|
44
|
+
}
|
|
45
|
+
const distanceTo43 = Math.abs(4 / 3 - aspectRatio);
|
|
46
|
+
const distanceTo169 = Math.abs(16 / 9 - aspectRatio);
|
|
47
|
+
return distanceTo43 < distanceTo169 ? 4 / 3 : 16 / 9;
|
|
48
|
+
}
|
|
49
|
+
static getStandardQuality(height) {
|
|
50
|
+
if (height <= 240) {
|
|
51
|
+
return 240;
|
|
52
|
+
}
|
|
53
|
+
if (height <= 360) {
|
|
54
|
+
return 360;
|
|
55
|
+
}
|
|
56
|
+
if (height <= 480) {
|
|
57
|
+
return 480;
|
|
58
|
+
}
|
|
59
|
+
if (height <= 720) {
|
|
60
|
+
return 720;
|
|
61
|
+
}
|
|
62
|
+
return 1080;
|
|
63
|
+
}
|
|
64
|
+
static getStandardResolution(width, height) {
|
|
65
|
+
if (width === 0 || height === 0) {
|
|
66
|
+
return { width: 0, height: 0 };
|
|
67
|
+
}
|
|
68
|
+
const aspectRatio = Viewport.getStandardAspectRatio(width, height);
|
|
69
|
+
if (width < height) {
|
|
70
|
+
const quality = Viewport.getStandardQuality(height * aspectRatio);
|
|
71
|
+
return { width: Math.round(quality), height: Math.round(quality / aspectRatio) };
|
|
72
|
+
}
|
|
73
|
+
const quality = Viewport.getStandardQuality(width / aspectRatio);
|
|
74
|
+
return { width: Math.round(quality * aspectRatio), height: Math.round(quality) };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
4
77
|
|
|
5
78
|
class NgViewerComponent {
|
|
6
79
|
constructor() {
|
|
80
|
+
this.hotspots = [];
|
|
81
|
+
this.hotspotTemplateRef = null;
|
|
7
82
|
this.onLoadStart = new EventEmitter();
|
|
8
83
|
this.onLoadProgress = new EventEmitter();
|
|
9
84
|
this.onLoadEnd = new EventEmitter();
|
|
@@ -11,6 +86,9 @@ class NgViewerComponent {
|
|
|
11
86
|
this.onInteraction = new EventEmitter();
|
|
12
87
|
this.onVrcubeInteraction = new EventEmitter();
|
|
13
88
|
this.onVrobjectInteraction = new EventEmitter();
|
|
89
|
+
this.fitPosition = { width: 1, height: 1, top: 1, left: 1 };
|
|
90
|
+
this.scaleX = 1;
|
|
91
|
+
this.scaleY = 1;
|
|
14
92
|
}
|
|
15
93
|
ngAfterViewInit() {
|
|
16
94
|
this.viewer = new Viewer(this.container.nativeElement, {
|
|
@@ -25,6 +103,7 @@ class NgViewerComponent {
|
|
|
25
103
|
onInteraction: (...args) => { this.onInteraction.emit(...args); },
|
|
26
104
|
onVrcubeInteraction: (...args) => { this.onVrcubeInteraction.emit(...args); },
|
|
27
105
|
onVrobjectInteraction: (...args) => { this.onVrobjectInteraction.emit(...args); },
|
|
106
|
+
onHotspotsChange: this.onHotspotsChange.bind(this)
|
|
28
107
|
},
|
|
29
108
|
});
|
|
30
109
|
if (this['scene']) {
|
|
@@ -45,6 +124,14 @@ class NgViewerComponent {
|
|
|
45
124
|
if (this.vrobject) {
|
|
46
125
|
this.viewer.setVrobject(this.vrobject);
|
|
47
126
|
}
|
|
127
|
+
if (this.tags) {
|
|
128
|
+
this.viewer.setTags(this.tags);
|
|
129
|
+
}
|
|
130
|
+
this.onResize();
|
|
131
|
+
}
|
|
132
|
+
ngOnDestroy() {
|
|
133
|
+
var _a;
|
|
134
|
+
(_a = this.viewer) === null || _a === void 0 ? void 0 : _a.destroy();
|
|
48
135
|
}
|
|
49
136
|
ngOnChanges(changes) {
|
|
50
137
|
if (!this.viewer) {
|
|
@@ -59,6 +146,9 @@ class NgViewerComponent {
|
|
|
59
146
|
if (changes['parameters'] && changes['parameters'].currentValue) {
|
|
60
147
|
this.viewer.setParameters(changes['parameters'].currentValue).catch(() => { });
|
|
61
148
|
}
|
|
149
|
+
if (changes['tags'] && changes['tags'].currentValue) {
|
|
150
|
+
this.viewer.setTags(changes['tags'].currentValue);
|
|
151
|
+
}
|
|
62
152
|
if (changes['view'] && changes['view'].currentValue) {
|
|
63
153
|
this.viewer.setView(changes['view'].currentValue).catch(() => { });
|
|
64
154
|
}
|
|
@@ -69,21 +159,46 @@ class NgViewerComponent {
|
|
|
69
159
|
this.viewer.setVrobject(changes['vrobject'].currentValue);
|
|
70
160
|
}
|
|
71
161
|
}
|
|
162
|
+
onHotspotsChange(hotspots) {
|
|
163
|
+
this.hotspots = hotspots;
|
|
164
|
+
if (this.hotspotsFilter !== undefined) {
|
|
165
|
+
this.hotspots = this.hotspotsFilter(this.hotspots);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
72
168
|
snapshot(type, quality) {
|
|
73
169
|
var _a;
|
|
74
170
|
return (_a = this.viewer) === null || _a === void 0 ? void 0 : _a.snapshot(type, quality);
|
|
75
171
|
}
|
|
172
|
+
onResize() {
|
|
173
|
+
this.resolution = Viewport.getStandardResolution(window.innerWidth, window.innerHeight);
|
|
174
|
+
this.fitPosition = Viewport.fit(this.resolution, window.innerWidth, window.innerHeight, 'cover');
|
|
175
|
+
this.scaleX = this.fitPosition.width / this.resolution.width;
|
|
176
|
+
this.scaleY = this.fitPosition.height / this.resolution.height;
|
|
177
|
+
}
|
|
178
|
+
hotspotStyle(hotspot) {
|
|
179
|
+
var _a;
|
|
180
|
+
if (((_a = this.view) === null || _a === void 0 ? void 0 : _a.mode) === 'vrcube') {
|
|
181
|
+
return {
|
|
182
|
+
position: 'absolute',
|
|
183
|
+
top: hotspot.position2D.y + 'px',
|
|
184
|
+
left: hotspot.position2D.x + 'px'
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
return {
|
|
189
|
+
position: 'absolute',
|
|
190
|
+
top: (hotspot.position2D.y * this.scaleY + this.fitPosition.top) + 'px',
|
|
191
|
+
left: (hotspot.position2D.x * this.scaleX + this.fitPosition.left) + 'px'
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
}
|
|
76
195
|
}
|
|
77
|
-
NgViewerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.
|
|
78
|
-
NgViewerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.
|
|
79
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.
|
|
196
|
+
NgViewerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgViewerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
197
|
+
NgViewerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: NgViewerComponent, selector: "NgViewer", inputs: { server: "server", api: "api", fit: "fit", scene: "scene", encoder: "encoder", parameters: "parameters", view: "view", vrcube: "vrcube", vrobject: "vrobject", tags: "tags", hotspotTemplateRef: "hotspotTemplateRef", hotspotsFilter: "hotspotsFilter" }, outputs: { onLoadStart: "onLoadStart", onLoadProgress: "onLoadProgress", onLoadEnd: "onLoadEnd", onLoadError: "onLoadError", onInteraction: "onInteraction", onVrcubeInteraction: "onVrcubeInteraction", onVrobjectInteraction: "onVrobjectInteraction" }, host: { listeners: { "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #container></div>\n\n<div class=\"position-absolute w-100 h-100\" style=\"pointer-events: none;\" *ngIf=\"hotspots.length\">\n <div [ngStyle]=\"hotspotStyle(hotspot)\" *ngFor=\"let hotspot of hotspots\">\n <ng-container *ngTemplateOutlet=\"hotspotTemplateRef; context:{hotspot: hotspot}\"></ng-container>\n </div>\n</div>", styles: [":host{display:flex;flex:1 0 auto}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
|
|
198
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgViewerComponent, decorators: [{
|
|
80
199
|
type: Component,
|
|
81
|
-
args: [{
|
|
82
|
-
|
|
83
|
-
template: '<div #container></div>',
|
|
84
|
-
styles: [':host { display: flex; flex: 1 0 auto; }']
|
|
85
|
-
}]
|
|
86
|
-
}], ctorParameters: function () { return []; }, propDecorators: { server: [{
|
|
200
|
+
args: [{ selector: 'NgViewer', template: "<div #container></div>\n\n<div class=\"position-absolute w-100 h-100\" style=\"pointer-events: none;\" *ngIf=\"hotspots.length\">\n <div [ngStyle]=\"hotspotStyle(hotspot)\" *ngFor=\"let hotspot of hotspots\">\n <ng-container *ngTemplateOutlet=\"hotspotTemplateRef; context:{hotspot: hotspot}\"></ng-container>\n </div>\n</div>", styles: [":host{display:flex;flex:1 0 auto}\n"] }]
|
|
201
|
+
}], propDecorators: { server: [{
|
|
87
202
|
type: Input
|
|
88
203
|
}], api: [{
|
|
89
204
|
type: Input
|
|
@@ -101,6 +216,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImpor
|
|
|
101
216
|
type: Input
|
|
102
217
|
}], vrobject: [{
|
|
103
218
|
type: Input
|
|
219
|
+
}], tags: [{
|
|
220
|
+
type: Input
|
|
221
|
+
}], hotspotTemplateRef: [{
|
|
222
|
+
type: Input
|
|
223
|
+
}], hotspotsFilter: [{
|
|
224
|
+
type: Input
|
|
104
225
|
}], onLoadStart: [{
|
|
105
226
|
type: Output
|
|
106
227
|
}], onLoadProgress: [{
|
|
@@ -118,20 +239,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImpor
|
|
|
118
239
|
}], container: [{
|
|
119
240
|
type: ViewChild,
|
|
120
241
|
args: ['container']
|
|
242
|
+
}], onResize: [{
|
|
243
|
+
type: HostListener,
|
|
244
|
+
args: ['window:resize', ['$event']]
|
|
121
245
|
}] } });
|
|
122
246
|
|
|
123
247
|
class NgViewerModule {
|
|
124
248
|
}
|
|
125
|
-
NgViewerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.
|
|
126
|
-
NgViewerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.
|
|
127
|
-
NgViewerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.
|
|
128
|
-
|
|
249
|
+
NgViewerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgViewerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
250
|
+
NgViewerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgViewerModule, declarations: [NgViewerComponent], imports: [CommonModule], exports: [NgViewerComponent] });
|
|
251
|
+
NgViewerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgViewerModule, imports: [[
|
|
252
|
+
CommonModule
|
|
253
|
+
]] });
|
|
254
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgViewerModule, decorators: [{
|
|
129
255
|
type: NgModule,
|
|
130
256
|
args: [{
|
|
131
257
|
declarations: [
|
|
132
258
|
NgViewerComponent
|
|
133
259
|
],
|
|
134
|
-
imports: [
|
|
260
|
+
imports: [
|
|
261
|
+
CommonModule
|
|
262
|
+
],
|
|
135
263
|
exports: [
|
|
136
264
|
NgViewerComponent
|
|
137
265
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lumiscaphe-ng-viewer.mjs","sources":["../../../projects/ng-viewer/src/lib/ng-viewer.component.ts","../../../projects/ng-viewer/src/lib/ng-viewer.module.ts","../../../projects/ng-viewer/src/public-api.ts","../../../projects/ng-viewer/src/lumiscaphe-ng-viewer.ts"],"sourcesContent":["import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnChanges, SimpleChanges, ViewChild, Output } from '@angular/core';\n\nimport { Encoder, Parameters, Scene, View, Viewer, WidgetVRCube, WidgetVRObject } from '@lumiscaphe/viewer';\n\n@Component({\n selector: 'NgViewer',\n template: '<div #container></div>',\n styles: [':host { display: flex; flex: 1 0 auto; }']\n})\n\nexport class NgViewerComponent implements AfterViewInit, OnChanges {\n\n public viewer: Viewer | undefined;\n\n @Input() server: string | undefined;\n @Input() api: string | undefined;\n @Input() fit: 'contain' | 'cover' | 'fill' | undefined;\n @Input() scene: Scene | undefined;\n @Input() encoder: Encoder | undefined;\n @Input() parameters: Parameters | undefined;\n @Input() view: View | undefined;\n @Input() vrcube: Partial<WidgetVRCube> | undefined;\n @Input() vrobject: Partial<WidgetVRObject> | undefined;\n\n @Output() onLoadStart = new EventEmitter();\n @Output() onLoadProgress = new EventEmitter();\n @Output() onLoadEnd = new EventEmitter();\n @Output() onLoadError = new EventEmitter();\n @Output() onInteraction = new EventEmitter();\n @Output() onVrcubeInteraction = new EventEmitter();\n @Output() onVrobjectInteraction = new EventEmitter();\n\n @ViewChild('container') container!: ElementRef;\n\n constructor() {\n }\n\n ngAfterViewInit() {\n this.viewer = new Viewer(this.container.nativeElement, {\n server: this.server,\n api: this.api || 'v1',\n fit: this.fit || 'cover',\n events: {\n onLoadStart: (...args: any[]) => { this.onLoadStart.emit(...args); },\n onLoadProgress: (...args: any[]) => { this.onLoadProgress.emit(...args); },\n onLoadEnd: (...args: any[]) => { this.onLoadEnd.emit(...args); },\n onLoadError: (...args: any[]) => { this.onLoadError.emit(...args); },\n onInteraction: (...args: any[]) => { this.onInteraction.emit(...args); },\n onVrcubeInteraction: (...args: any[]) => { this.onVrcubeInteraction.emit(...args); },\n onVrobjectInteraction: (...args: any[]) => { this.onVrobjectInteraction.emit(...args); },\n },\n });\n\n if (this['scene']) {\n this.viewer.load(this.scene).catch(() => { });\n }\n\n if (this['encoder']) {\n this.viewer.setEncoder(this.encoder).catch(() => { });\n }\n\n if (this.parameters) {\n this.viewer.setParameters(this.parameters).catch(() => { });\n }\n\n if (this.view) {\n this.viewer.setView(this.view).catch(() => { });\n }\n\n if (this.vrcube) {\n this.viewer.setVrcube(this.vrcube);\n }\n\n if (this.vrobject) {\n this.viewer.setVrobject(this.vrobject);\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (!this.viewer) {\n return;\n }\n\n if (changes['scene'] && changes['scene'].currentValue) {\n this.viewer.load(changes['scene'].currentValue).catch(() => { });\n }\n\n if (changes['encoder'] && changes['encoder'].currentValue) {\n this.viewer.setEncoder(changes['encoder'].currentValue).catch(() => { });\n }\n\n if (changes['parameters'] && changes['parameters'].currentValue) {\n this.viewer.setParameters(changes['parameters'].currentValue).catch(() => { });\n }\n\n if (changes['view'] && changes['view'].currentValue) {\n this.viewer.setView(changes['view'].currentValue).catch(() => { });\n }\n\n if (changes['vrcube'] && changes['vrcube'].currentValue) {\n this.viewer.setVrcube(changes['vrcube'].currentValue);\n }\n\n if (changes['vrobject'] && changes['vrobject'].currentValue) {\n this.viewer.setVrobject(changes['vrobject'].currentValue);\n }\n }\n\n snapshot(type: string, quality: number): string | undefined {\n return this.viewer?.snapshot(type, quality);\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { NgViewerComponent } from './ng-viewer.component';\n\n@NgModule({\n declarations: [\n NgViewerComponent\n ],\n imports: [\n ],\n exports: [\n NgViewerComponent\n ]\n})\n\nexport class NgViewerModule { }\n","/*\n * Public API Surface of ng-viewer\n */\n\nexport * from './lib/ng-viewer.component';\nexport * from './lib/ng-viewer.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lumiscaphe-ng-viewer.mjs","sources":["../../../projects/ng-viewer/src/lib/viewport.ts","../../../projects/ng-viewer/src/lib/ng-viewer.component.ts","../../../projects/ng-viewer/src/lib/ng-viewer.component.html","../../../projects/ng-viewer/src/lib/ng-viewer.module.ts","../../../projects/ng-viewer/src/public-api.ts","../../../projects/ng-viewer/src/lumiscaphe-ng-viewer.ts"],"sourcesContent":["export class Viewport {\n public static fit(resolution: any, viewportWidth: any, viewportHeight: any, fit: any): { width: number, height: number, top: number, left: number } {\n const aspectRatio = resolution.width / resolution.height;\n const viewportRatio = viewportWidth / viewportHeight;\n\n let width = 0;\n let height = 0;\n\n switch (fit) {\n case 'contain':\n width = viewportRatio < aspectRatio ? viewportWidth : viewportHeight * aspectRatio;\n height = viewportRatio < aspectRatio ? viewportWidth / aspectRatio : viewportHeight;\n break;\n case 'cover':\n default:\n width = viewportRatio < aspectRatio ? viewportHeight * aspectRatio : viewportWidth;\n height = viewportRatio < aspectRatio ? viewportHeight : viewportWidth / aspectRatio;\n break;\n case 'fill':\n width = viewportWidth;\n height = viewportHeight;\n break;\n }\n\n return {\n width: Math.round(width),\n height: Math.round(height),\n top: Math.round((viewportHeight - height) / 2),\n left: Math.round((viewportWidth - width) / 2),\n };\n }\n\n static getStandardAspectRatio(width: number, height: number): number {\n if (width === 0 || height === 0) {\n return 0;\n }\n\n const aspectRatio = width / height;\n\n if (width < height) {\n const distanceTo34 = Math.abs(3 / 4 - aspectRatio);\n const distanceTo916 = Math.abs(9 / 16 - aspectRatio);\n return distanceTo34 < distanceTo916 ? 3 / 4 : 9 / 16;\n }\n\n const distanceTo43 = Math.abs(4 / 3 - aspectRatio);\n const distanceTo169 = Math.abs(16 / 9 - aspectRatio);\n\n return distanceTo43 < distanceTo169 ? 4 / 3 : 16 / 9;\n }\n\n static getStandardQuality(height: number): number {\n if (height <= 240) {\n return 240;\n }\n\n if (height <= 360) {\n return 360;\n }\n\n if (height <= 480) {\n return 480;\n }\n\n if (height <= 720) {\n return 720;\n }\n\n return 1080;\n }\n\n public static getStandardResolution(width: number, height: number): { width: number, height: number } {\n if (width === 0 || height === 0) {\n return { width: 0, height: 0 };\n }\n\n const aspectRatio = Viewport.getStandardAspectRatio(width, height);\n\n if (width < height) {\n const quality = Viewport.getStandardQuality(height * aspectRatio);\n return { width: Math.round(quality), height: Math.round(quality / aspectRatio) };\n }\n\n const quality = Viewport.getStandardQuality(width / aspectRatio);\n return { width: Math.round(quality * aspectRatio), height: Math.round(quality) };\n }\n}\n\nexport default Viewport;\n","import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, SimpleChanges, ViewChild, Output, TemplateRef, HostListener } from '@angular/core';\n\nimport { Encoder, Hotspot, Parameters, Scene, View, Viewer, WidgetVRCube, WidgetVRObject } from '@lumiscaphe/viewer';\nimport Viewport from './viewport';\n\n@Component({\n selector: 'NgViewer',\n templateUrl: './ng-viewer.component.html',\n styleUrls: ['./ng-viewer.component.scss']\n})\n\nexport class NgViewerComponent implements AfterViewInit, OnChanges, OnDestroy {\n\n public viewer: Viewer | undefined;\n\n public hotspots: Hotspot[] = [];\n\n @Input() server: string | undefined;\n @Input() api: string | undefined;\n @Input() fit: 'contain' | 'cover' | 'fill' | undefined;\n @Input() scene: Scene | undefined;\n @Input() encoder: Encoder | undefined;\n @Input() parameters: Parameters | undefined;\n @Input() view: View | undefined;\n @Input() vrcube: Partial<WidgetVRCube> | undefined;\n @Input() vrobject: Partial<WidgetVRObject> | undefined;\n @Input() tags: string[] | undefined;\n @Input() hotspotTemplateRef: TemplateRef<any> | null = null;\n @Input() hotspotsFilter: ((hotspots: Hotspot[]) => Hotspot[]) | undefined;\n\n @Output() onLoadStart = new EventEmitter();\n @Output() onLoadProgress = new EventEmitter();\n @Output() onLoadEnd = new EventEmitter();\n @Output() onLoadError = new EventEmitter();\n @Output() onInteraction = new EventEmitter();\n @Output() onVrcubeInteraction = new EventEmitter();\n @Output() onVrobjectInteraction = new EventEmitter();\n\n @ViewChild('container') container!: ElementRef;\n\n ngAfterViewInit() {\n this.viewer = new Viewer(this.container.nativeElement, {\n server: this.server,\n api: this.api || 'v1',\n fit: this.fit || 'cover',\n events: {\n onLoadStart: (...args: any[]) => { this.onLoadStart.emit(...args); },\n onLoadProgress: (...args: any[]) => { this.onLoadProgress.emit(...args); },\n onLoadEnd: (...args: any[]) => { this.onLoadEnd.emit(...args); },\n onLoadError: (...args: any[]) => { this.onLoadError.emit(...args); },\n onInteraction: (...args: any[]) => { this.onInteraction.emit(...args); },\n onVrcubeInteraction: (...args: any[]) => { this.onVrcubeInteraction.emit(...args); },\n onVrobjectInteraction: (...args: any[]) => { this.onVrobjectInteraction.emit(...args); },\n onHotspotsChange: this.onHotspotsChange.bind(this)\n },\n });\n\n if (this['scene']) {\n this.viewer.load(this.scene).catch(() => { });\n }\n\n if (this['encoder']) {\n this.viewer.setEncoder(this.encoder).catch(() => { });\n }\n\n if (this.parameters) {\n this.viewer.setParameters(this.parameters).catch(() => { });\n }\n\n if (this.view) {\n this.viewer.setView(this.view).catch(() => { });\n }\n\n if (this.vrcube) {\n this.viewer.setVrcube(this.vrcube);\n }\n\n if (this.vrobject) {\n this.viewer.setVrobject(this.vrobject);\n }\n\n if (this.tags) {\n this.viewer.setTags(this.tags);\n }\n\n this.onResize();\n }\n\n ngOnDestroy(): void {\n this.viewer?.destroy();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (!this.viewer) {\n return;\n }\n\n if (changes['scene'] && changes['scene'].currentValue) {\n this.viewer.load(changes['scene'].currentValue).catch(() => { });\n }\n\n if (changes['encoder'] && changes['encoder'].currentValue) {\n this.viewer.setEncoder(changes['encoder'].currentValue).catch(() => { });\n }\n\n if (changes['parameters'] && changes['parameters'].currentValue) {\n this.viewer.setParameters(changes['parameters'].currentValue).catch(() => { });\n }\n\n if (changes['tags'] && changes['tags'].currentValue) {\n this.viewer.setTags(changes['tags'].currentValue);\n }\n\n if (changes['view'] && changes['view'].currentValue) {\n this.viewer.setView(changes['view'].currentValue).catch(() => { });\n }\n\n if (changes['vrcube'] && changes['vrcube'].currentValue) {\n this.viewer.setVrcube(changes['vrcube'].currentValue);\n }\n\n if (changes['vrobject'] && changes['vrobject'].currentValue) {\n this.viewer.setVrobject(changes['vrobject'].currentValue);\n }\n }\n\n onHotspotsChange(hotspots: Hotspot[]): void {\n this.hotspots = hotspots;\n\n if (this.hotspotsFilter !== undefined) {\n this.hotspots = this.hotspotsFilter(this.hotspots);\n }\n }\n\n snapshot(type: string, quality: number): string | undefined {\n return this.viewer?.snapshot(type, quality);\n }\n\n public fitPosition: { width: number, height: number, top: number, left: number } = { width: 1, height: 1, top: 1, left: 1 };\n public resolution: { width: number, height: number } | undefined;\n public scaleX: number = 1;\n public scaleY: number = 1;\n\n @HostListener('window:resize', ['$event'])\n public onResize(): void {\n this.resolution = Viewport.getStandardResolution(window.innerWidth, window.innerHeight);\n this.fitPosition = Viewport.fit(this.resolution, window.innerWidth, window.innerHeight, 'cover');\n this.scaleX = this.fitPosition.width / this.resolution.width;\n this.scaleY = this.fitPosition.height / this.resolution.height;\n }\n\n public hotspotStyle(hotspot: Hotspot): { left: string, top: string, position: string } {\n if (this.view?.mode === 'vrcube') {\n return {\n position: 'absolute',\n top: hotspot.position2D.y + 'px',\n left: hotspot.position2D.x + 'px'\n };\n } else {\n return {\n position: 'absolute',\n top: (hotspot.position2D.y * this.scaleY + this.fitPosition.top) + 'px',\n left: (hotspot.position2D.x * this.scaleX + this.fitPosition.left) + 'px'\n };\n }\n }\n}\n","<div #container></div>\n\n<div class=\"position-absolute w-100 h-100\" style=\"pointer-events: none;\" *ngIf=\"hotspots.length\">\n <div [ngStyle]=\"hotspotStyle(hotspot)\" *ngFor=\"let hotspot of hotspots\">\n <ng-container *ngTemplateOutlet=\"hotspotTemplateRef; context:{hotspot: hotspot}\"></ng-container>\n </div>\n</div>","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { NgViewerComponent } from './ng-viewer.component';\n\n@NgModule({\n declarations: [\n NgViewerComponent\n ],\n imports: [\n CommonModule\n ],\n exports: [\n NgViewerComponent\n ]\n})\n\nexport class NgViewerModule { }\n","/*\n * Public API Surface of ng-viewer\n */\n\nexport * from './lib/ng-viewer.component';\nexport * from './lib/ng-viewer.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,84 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { EventEmitter, Component, Input, Output, ViewChild, NgModule } from '@angular/core';
|
|
2
|
+
import { EventEmitter, Component, Input, Output, ViewChild, HostListener, NgModule } from '@angular/core';
|
|
3
3
|
import { Viewer } from '@lumiscaphe/viewer';
|
|
4
|
+
import * as i1 from '@angular/common';
|
|
5
|
+
import { CommonModule } from '@angular/common';
|
|
6
|
+
|
|
7
|
+
class Viewport {
|
|
8
|
+
static fit(resolution, viewportWidth, viewportHeight, fit) {
|
|
9
|
+
const aspectRatio = resolution.width / resolution.height;
|
|
10
|
+
const viewportRatio = viewportWidth / viewportHeight;
|
|
11
|
+
let width = 0;
|
|
12
|
+
let height = 0;
|
|
13
|
+
switch (fit) {
|
|
14
|
+
case 'contain':
|
|
15
|
+
width = viewportRatio < aspectRatio ? viewportWidth : viewportHeight * aspectRatio;
|
|
16
|
+
height = viewportRatio < aspectRatio ? viewportWidth / aspectRatio : viewportHeight;
|
|
17
|
+
break;
|
|
18
|
+
case 'cover':
|
|
19
|
+
default:
|
|
20
|
+
width = viewportRatio < aspectRatio ? viewportHeight * aspectRatio : viewportWidth;
|
|
21
|
+
height = viewportRatio < aspectRatio ? viewportHeight : viewportWidth / aspectRatio;
|
|
22
|
+
break;
|
|
23
|
+
case 'fill':
|
|
24
|
+
width = viewportWidth;
|
|
25
|
+
height = viewportHeight;
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
width: Math.round(width),
|
|
30
|
+
height: Math.round(height),
|
|
31
|
+
top: Math.round((viewportHeight - height) / 2),
|
|
32
|
+
left: Math.round((viewportWidth - width) / 2),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
static getStandardAspectRatio(width, height) {
|
|
36
|
+
if (width === 0 || height === 0) {
|
|
37
|
+
return 0;
|
|
38
|
+
}
|
|
39
|
+
const aspectRatio = width / height;
|
|
40
|
+
if (width < height) {
|
|
41
|
+
const distanceTo34 = Math.abs(3 / 4 - aspectRatio);
|
|
42
|
+
const distanceTo916 = Math.abs(9 / 16 - aspectRatio);
|
|
43
|
+
return distanceTo34 < distanceTo916 ? 3 / 4 : 9 / 16;
|
|
44
|
+
}
|
|
45
|
+
const distanceTo43 = Math.abs(4 / 3 - aspectRatio);
|
|
46
|
+
const distanceTo169 = Math.abs(16 / 9 - aspectRatio);
|
|
47
|
+
return distanceTo43 < distanceTo169 ? 4 / 3 : 16 / 9;
|
|
48
|
+
}
|
|
49
|
+
static getStandardQuality(height) {
|
|
50
|
+
if (height <= 240) {
|
|
51
|
+
return 240;
|
|
52
|
+
}
|
|
53
|
+
if (height <= 360) {
|
|
54
|
+
return 360;
|
|
55
|
+
}
|
|
56
|
+
if (height <= 480) {
|
|
57
|
+
return 480;
|
|
58
|
+
}
|
|
59
|
+
if (height <= 720) {
|
|
60
|
+
return 720;
|
|
61
|
+
}
|
|
62
|
+
return 1080;
|
|
63
|
+
}
|
|
64
|
+
static getStandardResolution(width, height) {
|
|
65
|
+
if (width === 0 || height === 0) {
|
|
66
|
+
return { width: 0, height: 0 };
|
|
67
|
+
}
|
|
68
|
+
const aspectRatio = Viewport.getStandardAspectRatio(width, height);
|
|
69
|
+
if (width < height) {
|
|
70
|
+
const quality = Viewport.getStandardQuality(height * aspectRatio);
|
|
71
|
+
return { width: Math.round(quality), height: Math.round(quality / aspectRatio) };
|
|
72
|
+
}
|
|
73
|
+
const quality = Viewport.getStandardQuality(width / aspectRatio);
|
|
74
|
+
return { width: Math.round(quality * aspectRatio), height: Math.round(quality) };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
4
77
|
|
|
5
78
|
class NgViewerComponent {
|
|
6
79
|
constructor() {
|
|
80
|
+
this.hotspots = [];
|
|
81
|
+
this.hotspotTemplateRef = null;
|
|
7
82
|
this.onLoadStart = new EventEmitter();
|
|
8
83
|
this.onLoadProgress = new EventEmitter();
|
|
9
84
|
this.onLoadEnd = new EventEmitter();
|
|
@@ -11,6 +86,9 @@ class NgViewerComponent {
|
|
|
11
86
|
this.onInteraction = new EventEmitter();
|
|
12
87
|
this.onVrcubeInteraction = new EventEmitter();
|
|
13
88
|
this.onVrobjectInteraction = new EventEmitter();
|
|
89
|
+
this.fitPosition = { width: 1, height: 1, top: 1, left: 1 };
|
|
90
|
+
this.scaleX = 1;
|
|
91
|
+
this.scaleY = 1;
|
|
14
92
|
}
|
|
15
93
|
ngAfterViewInit() {
|
|
16
94
|
this.viewer = new Viewer(this.container.nativeElement, {
|
|
@@ -25,6 +103,7 @@ class NgViewerComponent {
|
|
|
25
103
|
onInteraction: (...args) => { this.onInteraction.emit(...args); },
|
|
26
104
|
onVrcubeInteraction: (...args) => { this.onVrcubeInteraction.emit(...args); },
|
|
27
105
|
onVrobjectInteraction: (...args) => { this.onVrobjectInteraction.emit(...args); },
|
|
106
|
+
onHotspotsChange: this.onHotspotsChange.bind(this)
|
|
28
107
|
},
|
|
29
108
|
});
|
|
30
109
|
if (this['scene']) {
|
|
@@ -45,6 +124,13 @@ class NgViewerComponent {
|
|
|
45
124
|
if (this.vrobject) {
|
|
46
125
|
this.viewer.setVrobject(this.vrobject);
|
|
47
126
|
}
|
|
127
|
+
if (this.tags) {
|
|
128
|
+
this.viewer.setTags(this.tags);
|
|
129
|
+
}
|
|
130
|
+
this.onResize();
|
|
131
|
+
}
|
|
132
|
+
ngOnDestroy() {
|
|
133
|
+
this.viewer?.destroy();
|
|
48
134
|
}
|
|
49
135
|
ngOnChanges(changes) {
|
|
50
136
|
if (!this.viewer) {
|
|
@@ -59,6 +145,9 @@ class NgViewerComponent {
|
|
|
59
145
|
if (changes['parameters'] && changes['parameters'].currentValue) {
|
|
60
146
|
this.viewer.setParameters(changes['parameters'].currentValue).catch(() => { });
|
|
61
147
|
}
|
|
148
|
+
if (changes['tags'] && changes['tags'].currentValue) {
|
|
149
|
+
this.viewer.setTags(changes['tags'].currentValue);
|
|
150
|
+
}
|
|
62
151
|
if (changes['view'] && changes['view'].currentValue) {
|
|
63
152
|
this.viewer.setView(changes['view'].currentValue).catch(() => { });
|
|
64
153
|
}
|
|
@@ -69,20 +158,44 @@ class NgViewerComponent {
|
|
|
69
158
|
this.viewer.setVrobject(changes['vrobject'].currentValue);
|
|
70
159
|
}
|
|
71
160
|
}
|
|
161
|
+
onHotspotsChange(hotspots) {
|
|
162
|
+
this.hotspots = hotspots;
|
|
163
|
+
if (this.hotspotsFilter !== undefined) {
|
|
164
|
+
this.hotspots = this.hotspotsFilter(this.hotspots);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
72
167
|
snapshot(type, quality) {
|
|
73
168
|
return this.viewer?.snapshot(type, quality);
|
|
74
169
|
}
|
|
170
|
+
onResize() {
|
|
171
|
+
this.resolution = Viewport.getStandardResolution(window.innerWidth, window.innerHeight);
|
|
172
|
+
this.fitPosition = Viewport.fit(this.resolution, window.innerWidth, window.innerHeight, 'cover');
|
|
173
|
+
this.scaleX = this.fitPosition.width / this.resolution.width;
|
|
174
|
+
this.scaleY = this.fitPosition.height / this.resolution.height;
|
|
175
|
+
}
|
|
176
|
+
hotspotStyle(hotspot) {
|
|
177
|
+
if (this.view?.mode === 'vrcube') {
|
|
178
|
+
return {
|
|
179
|
+
position: 'absolute',
|
|
180
|
+
top: hotspot.position2D.y + 'px',
|
|
181
|
+
left: hotspot.position2D.x + 'px'
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
return {
|
|
186
|
+
position: 'absolute',
|
|
187
|
+
top: (hotspot.position2D.y * this.scaleY + this.fitPosition.top) + 'px',
|
|
188
|
+
left: (hotspot.position2D.x * this.scaleX + this.fitPosition.left) + 'px'
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
}
|
|
75
192
|
}
|
|
76
|
-
NgViewerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.
|
|
77
|
-
NgViewerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.
|
|
78
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.
|
|
193
|
+
NgViewerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgViewerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
194
|
+
NgViewerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: NgViewerComponent, selector: "NgViewer", inputs: { server: "server", api: "api", fit: "fit", scene: "scene", encoder: "encoder", parameters: "parameters", view: "view", vrcube: "vrcube", vrobject: "vrobject", tags: "tags", hotspotTemplateRef: "hotspotTemplateRef", hotspotsFilter: "hotspotsFilter" }, outputs: { onLoadStart: "onLoadStart", onLoadProgress: "onLoadProgress", onLoadEnd: "onLoadEnd", onLoadError: "onLoadError", onInteraction: "onInteraction", onVrcubeInteraction: "onVrcubeInteraction", onVrobjectInteraction: "onVrobjectInteraction" }, host: { listeners: { "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #container></div>\n\n<div class=\"position-absolute w-100 h-100\" style=\"pointer-events: none;\" *ngIf=\"hotspots.length\">\n <div [ngStyle]=\"hotspotStyle(hotspot)\" *ngFor=\"let hotspot of hotspots\">\n <ng-container *ngTemplateOutlet=\"hotspotTemplateRef; context:{hotspot: hotspot}\"></ng-container>\n </div>\n</div>", styles: [":host{display:flex;flex:1 0 auto}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
|
|
195
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgViewerComponent, decorators: [{
|
|
79
196
|
type: Component,
|
|
80
|
-
args: [{
|
|
81
|
-
|
|
82
|
-
template: '<div #container></div>',
|
|
83
|
-
styles: [':host { display: flex; flex: 1 0 auto; }']
|
|
84
|
-
}]
|
|
85
|
-
}], ctorParameters: function () { return []; }, propDecorators: { server: [{
|
|
197
|
+
args: [{ selector: 'NgViewer', template: "<div #container></div>\n\n<div class=\"position-absolute w-100 h-100\" style=\"pointer-events: none;\" *ngIf=\"hotspots.length\">\n <div [ngStyle]=\"hotspotStyle(hotspot)\" *ngFor=\"let hotspot of hotspots\">\n <ng-container *ngTemplateOutlet=\"hotspotTemplateRef; context:{hotspot: hotspot}\"></ng-container>\n </div>\n</div>", styles: [":host{display:flex;flex:1 0 auto}\n"] }]
|
|
198
|
+
}], propDecorators: { server: [{
|
|
86
199
|
type: Input
|
|
87
200
|
}], api: [{
|
|
88
201
|
type: Input
|
|
@@ -100,6 +213,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImpor
|
|
|
100
213
|
type: Input
|
|
101
214
|
}], vrobject: [{
|
|
102
215
|
type: Input
|
|
216
|
+
}], tags: [{
|
|
217
|
+
type: Input
|
|
218
|
+
}], hotspotTemplateRef: [{
|
|
219
|
+
type: Input
|
|
220
|
+
}], hotspotsFilter: [{
|
|
221
|
+
type: Input
|
|
103
222
|
}], onLoadStart: [{
|
|
104
223
|
type: Output
|
|
105
224
|
}], onLoadProgress: [{
|
|
@@ -117,20 +236,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImpor
|
|
|
117
236
|
}], container: [{
|
|
118
237
|
type: ViewChild,
|
|
119
238
|
args: ['container']
|
|
239
|
+
}], onResize: [{
|
|
240
|
+
type: HostListener,
|
|
241
|
+
args: ['window:resize', ['$event']]
|
|
120
242
|
}] } });
|
|
121
243
|
|
|
122
244
|
class NgViewerModule {
|
|
123
245
|
}
|
|
124
|
-
NgViewerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.
|
|
125
|
-
NgViewerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.
|
|
126
|
-
NgViewerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.
|
|
127
|
-
|
|
246
|
+
NgViewerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgViewerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
247
|
+
NgViewerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgViewerModule, declarations: [NgViewerComponent], imports: [CommonModule], exports: [NgViewerComponent] });
|
|
248
|
+
NgViewerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgViewerModule, imports: [[
|
|
249
|
+
CommonModule
|
|
250
|
+
]] });
|
|
251
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgViewerModule, decorators: [{
|
|
128
252
|
type: NgModule,
|
|
129
253
|
args: [{
|
|
130
254
|
declarations: [
|
|
131
255
|
NgViewerComponent
|
|
132
256
|
],
|
|
133
|
-
imports: [
|
|
257
|
+
imports: [
|
|
258
|
+
CommonModule
|
|
259
|
+
],
|
|
134
260
|
exports: [
|
|
135
261
|
NgViewerComponent
|
|
136
262
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lumiscaphe-ng-viewer.mjs","sources":["../../../projects/ng-viewer/src/lib/ng-viewer.component.ts","../../../projects/ng-viewer/src/lib/ng-viewer.module.ts","../../../projects/ng-viewer/src/public-api.ts","../../../projects/ng-viewer/src/lumiscaphe-ng-viewer.ts"],"sourcesContent":["import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnChanges, SimpleChanges, ViewChild, Output } from '@angular/core';\n\nimport { Encoder, Parameters, Scene, View, Viewer, WidgetVRCube, WidgetVRObject } from '@lumiscaphe/viewer';\n\n@Component({\n selector: 'NgViewer',\n template: '<div #container></div>',\n styles: [':host { display: flex; flex: 1 0 auto; }']\n})\n\nexport class NgViewerComponent implements AfterViewInit, OnChanges {\n\n public viewer: Viewer | undefined;\n\n @Input() server: string | undefined;\n @Input() api: string | undefined;\n @Input() fit: 'contain' | 'cover' | 'fill' | undefined;\n @Input() scene: Scene | undefined;\n @Input() encoder: Encoder | undefined;\n @Input() parameters: Parameters | undefined;\n @Input() view: View | undefined;\n @Input() vrcube: Partial<WidgetVRCube> | undefined;\n @Input() vrobject: Partial<WidgetVRObject> | undefined;\n\n @Output() onLoadStart = new EventEmitter();\n @Output() onLoadProgress = new EventEmitter();\n @Output() onLoadEnd = new EventEmitter();\n @Output() onLoadError = new EventEmitter();\n @Output() onInteraction = new EventEmitter();\n @Output() onVrcubeInteraction = new EventEmitter();\n @Output() onVrobjectInteraction = new EventEmitter();\n\n @ViewChild('container') container!: ElementRef;\n\n constructor() {\n }\n\n ngAfterViewInit() {\n this.viewer = new Viewer(this.container.nativeElement, {\n server: this.server,\n api: this.api || 'v1',\n fit: this.fit || 'cover',\n events: {\n onLoadStart: (...args: any[]) => { this.onLoadStart.emit(...args); },\n onLoadProgress: (...args: any[]) => { this.onLoadProgress.emit(...args); },\n onLoadEnd: (...args: any[]) => { this.onLoadEnd.emit(...args); },\n onLoadError: (...args: any[]) => { this.onLoadError.emit(...args); },\n onInteraction: (...args: any[]) => { this.onInteraction.emit(...args); },\n onVrcubeInteraction: (...args: any[]) => { this.onVrcubeInteraction.emit(...args); },\n onVrobjectInteraction: (...args: any[]) => { this.onVrobjectInteraction.emit(...args); },\n },\n });\n\n if (this['scene']) {\n this.viewer.load(this.scene).catch(() => { });\n }\n\n if (this['encoder']) {\n this.viewer.setEncoder(this.encoder).catch(() => { });\n }\n\n if (this.parameters) {\n this.viewer.setParameters(this.parameters).catch(() => { });\n }\n\n if (this.view) {\n this.viewer.setView(this.view).catch(() => { });\n }\n\n if (this.vrcube) {\n this.viewer.setVrcube(this.vrcube);\n }\n\n if (this.vrobject) {\n this.viewer.setVrobject(this.vrobject);\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (!this.viewer) {\n return;\n }\n\n if (changes['scene'] && changes['scene'].currentValue) {\n this.viewer.load(changes['scene'].currentValue).catch(() => { });\n }\n\n if (changes['encoder'] && changes['encoder'].currentValue) {\n this.viewer.setEncoder(changes['encoder'].currentValue).catch(() => { });\n }\n\n if (changes['parameters'] && changes['parameters'].currentValue) {\n this.viewer.setParameters(changes['parameters'].currentValue).catch(() => { });\n }\n\n if (changes['view'] && changes['view'].currentValue) {\n this.viewer.setView(changes['view'].currentValue).catch(() => { });\n }\n\n if (changes['vrcube'] && changes['vrcube'].currentValue) {\n this.viewer.setVrcube(changes['vrcube'].currentValue);\n }\n\n if (changes['vrobject'] && changes['vrobject'].currentValue) {\n this.viewer.setVrobject(changes['vrobject'].currentValue);\n }\n }\n\n snapshot(type: string, quality: number): string | undefined {\n return this.viewer?.snapshot(type, quality);\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { NgViewerComponent } from './ng-viewer.component';\n\n@NgModule({\n declarations: [\n NgViewerComponent\n ],\n imports: [\n ],\n exports: [\n NgViewerComponent\n ]\n})\n\nexport class NgViewerModule { }\n","/*\n * Public API Surface of ng-viewer\n */\n\nexport * from './lib/ng-viewer.component';\nexport * from './lib/ng-viewer.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lumiscaphe-ng-viewer.mjs","sources":["../../../projects/ng-viewer/src/lib/viewport.ts","../../../projects/ng-viewer/src/lib/ng-viewer.component.ts","../../../projects/ng-viewer/src/lib/ng-viewer.component.html","../../../projects/ng-viewer/src/lib/ng-viewer.module.ts","../../../projects/ng-viewer/src/public-api.ts","../../../projects/ng-viewer/src/lumiscaphe-ng-viewer.ts"],"sourcesContent":["export class Viewport {\n public static fit(resolution: any, viewportWidth: any, viewportHeight: any, fit: any): { width: number, height: number, top: number, left: number } {\n const aspectRatio = resolution.width / resolution.height;\n const viewportRatio = viewportWidth / viewportHeight;\n\n let width = 0;\n let height = 0;\n\n switch (fit) {\n case 'contain':\n width = viewportRatio < aspectRatio ? viewportWidth : viewportHeight * aspectRatio;\n height = viewportRatio < aspectRatio ? viewportWidth / aspectRatio : viewportHeight;\n break;\n case 'cover':\n default:\n width = viewportRatio < aspectRatio ? viewportHeight * aspectRatio : viewportWidth;\n height = viewportRatio < aspectRatio ? viewportHeight : viewportWidth / aspectRatio;\n break;\n case 'fill':\n width = viewportWidth;\n height = viewportHeight;\n break;\n }\n\n return {\n width: Math.round(width),\n height: Math.round(height),\n top: Math.round((viewportHeight - height) / 2),\n left: Math.round((viewportWidth - width) / 2),\n };\n }\n\n static getStandardAspectRatio(width: number, height: number): number {\n if (width === 0 || height === 0) {\n return 0;\n }\n\n const aspectRatio = width / height;\n\n if (width < height) {\n const distanceTo34 = Math.abs(3 / 4 - aspectRatio);\n const distanceTo916 = Math.abs(9 / 16 - aspectRatio);\n return distanceTo34 < distanceTo916 ? 3 / 4 : 9 / 16;\n }\n\n const distanceTo43 = Math.abs(4 / 3 - aspectRatio);\n const distanceTo169 = Math.abs(16 / 9 - aspectRatio);\n\n return distanceTo43 < distanceTo169 ? 4 / 3 : 16 / 9;\n }\n\n static getStandardQuality(height: number): number {\n if (height <= 240) {\n return 240;\n }\n\n if (height <= 360) {\n return 360;\n }\n\n if (height <= 480) {\n return 480;\n }\n\n if (height <= 720) {\n return 720;\n }\n\n return 1080;\n }\n\n public static getStandardResolution(width: number, height: number): { width: number, height: number } {\n if (width === 0 || height === 0) {\n return { width: 0, height: 0 };\n }\n\n const aspectRatio = Viewport.getStandardAspectRatio(width, height);\n\n if (width < height) {\n const quality = Viewport.getStandardQuality(height * aspectRatio);\n return { width: Math.round(quality), height: Math.round(quality / aspectRatio) };\n }\n\n const quality = Viewport.getStandardQuality(width / aspectRatio);\n return { width: Math.round(quality * aspectRatio), height: Math.round(quality) };\n }\n}\n\nexport default Viewport;\n","import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, SimpleChanges, ViewChild, Output, TemplateRef, HostListener } from '@angular/core';\n\nimport { Encoder, Hotspot, Parameters, Scene, View, Viewer, WidgetVRCube, WidgetVRObject } from '@lumiscaphe/viewer';\nimport Viewport from './viewport';\n\n@Component({\n selector: 'NgViewer',\n templateUrl: './ng-viewer.component.html',\n styleUrls: ['./ng-viewer.component.scss']\n})\n\nexport class NgViewerComponent implements AfterViewInit, OnChanges, OnDestroy {\n\n public viewer: Viewer | undefined;\n\n public hotspots: Hotspot[] = [];\n\n @Input() server: string | undefined;\n @Input() api: string | undefined;\n @Input() fit: 'contain' | 'cover' | 'fill' | undefined;\n @Input() scene: Scene | undefined;\n @Input() encoder: Encoder | undefined;\n @Input() parameters: Parameters | undefined;\n @Input() view: View | undefined;\n @Input() vrcube: Partial<WidgetVRCube> | undefined;\n @Input() vrobject: Partial<WidgetVRObject> | undefined;\n @Input() tags: string[] | undefined;\n @Input() hotspotTemplateRef: TemplateRef<any> | null = null;\n @Input() hotspotsFilter: ((hotspots: Hotspot[]) => Hotspot[]) | undefined;\n\n @Output() onLoadStart = new EventEmitter();\n @Output() onLoadProgress = new EventEmitter();\n @Output() onLoadEnd = new EventEmitter();\n @Output() onLoadError = new EventEmitter();\n @Output() onInteraction = new EventEmitter();\n @Output() onVrcubeInteraction = new EventEmitter();\n @Output() onVrobjectInteraction = new EventEmitter();\n\n @ViewChild('container') container!: ElementRef;\n\n ngAfterViewInit() {\n this.viewer = new Viewer(this.container.nativeElement, {\n server: this.server,\n api: this.api || 'v1',\n fit: this.fit || 'cover',\n events: {\n onLoadStart: (...args: any[]) => { this.onLoadStart.emit(...args); },\n onLoadProgress: (...args: any[]) => { this.onLoadProgress.emit(...args); },\n onLoadEnd: (...args: any[]) => { this.onLoadEnd.emit(...args); },\n onLoadError: (...args: any[]) => { this.onLoadError.emit(...args); },\n onInteraction: (...args: any[]) => { this.onInteraction.emit(...args); },\n onVrcubeInteraction: (...args: any[]) => { this.onVrcubeInteraction.emit(...args); },\n onVrobjectInteraction: (...args: any[]) => { this.onVrobjectInteraction.emit(...args); },\n onHotspotsChange: this.onHotspotsChange.bind(this)\n },\n });\n\n if (this['scene']) {\n this.viewer.load(this.scene).catch(() => { });\n }\n\n if (this['encoder']) {\n this.viewer.setEncoder(this.encoder).catch(() => { });\n }\n\n if (this.parameters) {\n this.viewer.setParameters(this.parameters).catch(() => { });\n }\n\n if (this.view) {\n this.viewer.setView(this.view).catch(() => { });\n }\n\n if (this.vrcube) {\n this.viewer.setVrcube(this.vrcube);\n }\n\n if (this.vrobject) {\n this.viewer.setVrobject(this.vrobject);\n }\n\n if (this.tags) {\n this.viewer.setTags(this.tags);\n }\n\n this.onResize();\n }\n\n ngOnDestroy(): void {\n this.viewer?.destroy();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (!this.viewer) {\n return;\n }\n\n if (changes['scene'] && changes['scene'].currentValue) {\n this.viewer.load(changes['scene'].currentValue).catch(() => { });\n }\n\n if (changes['encoder'] && changes['encoder'].currentValue) {\n this.viewer.setEncoder(changes['encoder'].currentValue).catch(() => { });\n }\n\n if (changes['parameters'] && changes['parameters'].currentValue) {\n this.viewer.setParameters(changes['parameters'].currentValue).catch(() => { });\n }\n\n if (changes['tags'] && changes['tags'].currentValue) {\n this.viewer.setTags(changes['tags'].currentValue);\n }\n\n if (changes['view'] && changes['view'].currentValue) {\n this.viewer.setView(changes['view'].currentValue).catch(() => { });\n }\n\n if (changes['vrcube'] && changes['vrcube'].currentValue) {\n this.viewer.setVrcube(changes['vrcube'].currentValue);\n }\n\n if (changes['vrobject'] && changes['vrobject'].currentValue) {\n this.viewer.setVrobject(changes['vrobject'].currentValue);\n }\n }\n\n onHotspotsChange(hotspots: Hotspot[]): void {\n this.hotspots = hotspots;\n\n if (this.hotspotsFilter !== undefined) {\n this.hotspots = this.hotspotsFilter(this.hotspots);\n }\n }\n\n snapshot(type: string, quality: number): string | undefined {\n return this.viewer?.snapshot(type, quality);\n }\n\n public fitPosition: { width: number, height: number, top: number, left: number } = { width: 1, height: 1, top: 1, left: 1 };\n public resolution: { width: number, height: number } | undefined;\n public scaleX: number = 1;\n public scaleY: number = 1;\n\n @HostListener('window:resize', ['$event'])\n public onResize(): void {\n this.resolution = Viewport.getStandardResolution(window.innerWidth, window.innerHeight);\n this.fitPosition = Viewport.fit(this.resolution, window.innerWidth, window.innerHeight, 'cover');\n this.scaleX = this.fitPosition.width / this.resolution.width;\n this.scaleY = this.fitPosition.height / this.resolution.height;\n }\n\n public hotspotStyle(hotspot: Hotspot): { left: string, top: string, position: string } {\n if (this.view?.mode === 'vrcube') {\n return {\n position: 'absolute',\n top: hotspot.position2D.y + 'px',\n left: hotspot.position2D.x + 'px'\n };\n } else {\n return {\n position: 'absolute',\n top: (hotspot.position2D.y * this.scaleY + this.fitPosition.top) + 'px',\n left: (hotspot.position2D.x * this.scaleX + this.fitPosition.left) + 'px'\n };\n }\n }\n}\n","<div #container></div>\n\n<div class=\"position-absolute w-100 h-100\" style=\"pointer-events: none;\" *ngIf=\"hotspots.length\">\n <div [ngStyle]=\"hotspotStyle(hotspot)\" *ngFor=\"let hotspot of hotspots\">\n <ng-container *ngTemplateOutlet=\"hotspotTemplateRef; context:{hotspot: hotspot}\"></ng-container>\n </div>\n</div>","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { NgViewerComponent } from './ng-viewer.component';\n\n@NgModule({\n declarations: [\n NgViewerComponent\n ],\n imports: [\n CommonModule\n ],\n exports: [\n NgViewerComponent\n ]\n})\n\nexport class NgViewerModule { }\n","/*\n * Public API Surface of ng-viewer\n */\n\nexport * from './lib/ng-viewer.component';\nexport * from './lib/ng-viewer.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { AfterViewInit, ElementRef, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
|
|
2
|
-
import { Encoder, Parameters, Scene, View, Viewer, WidgetVRCube, WidgetVRObject } from '@lumiscaphe/viewer';
|
|
1
|
+
import { AfterViewInit, ElementRef, EventEmitter, OnChanges, OnDestroy, SimpleChanges, TemplateRef } from '@angular/core';
|
|
2
|
+
import { Encoder, Hotspot, Parameters, Scene, View, Viewer, WidgetVRCube, WidgetVRObject } from '@lumiscaphe/viewer';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
|
-
export declare class NgViewerComponent implements AfterViewInit, OnChanges {
|
|
4
|
+
export declare class NgViewerComponent implements AfterViewInit, OnChanges, OnDestroy {
|
|
5
5
|
viewer: Viewer | undefined;
|
|
6
|
+
hotspots: Hotspot[];
|
|
6
7
|
server: string | undefined;
|
|
7
8
|
api: string | undefined;
|
|
8
9
|
fit: 'contain' | 'cover' | 'fill' | undefined;
|
|
@@ -12,6 +13,9 @@ export declare class NgViewerComponent implements AfterViewInit, OnChanges {
|
|
|
12
13
|
view: View | undefined;
|
|
13
14
|
vrcube: Partial<WidgetVRCube> | undefined;
|
|
14
15
|
vrobject: Partial<WidgetVRObject> | undefined;
|
|
16
|
+
tags: string[] | undefined;
|
|
17
|
+
hotspotTemplateRef: TemplateRef<any> | null;
|
|
18
|
+
hotspotsFilter: ((hotspots: Hotspot[]) => Hotspot[]) | undefined;
|
|
15
19
|
onLoadStart: EventEmitter<any>;
|
|
16
20
|
onLoadProgress: EventEmitter<any>;
|
|
17
21
|
onLoadEnd: EventEmitter<any>;
|
|
@@ -20,10 +24,29 @@ export declare class NgViewerComponent implements AfterViewInit, OnChanges {
|
|
|
20
24
|
onVrcubeInteraction: EventEmitter<any>;
|
|
21
25
|
onVrobjectInteraction: EventEmitter<any>;
|
|
22
26
|
container: ElementRef;
|
|
23
|
-
constructor();
|
|
24
27
|
ngAfterViewInit(): void;
|
|
28
|
+
ngOnDestroy(): void;
|
|
25
29
|
ngOnChanges(changes: SimpleChanges): void;
|
|
30
|
+
onHotspotsChange(hotspots: Hotspot[]): void;
|
|
26
31
|
snapshot(type: string, quality: number): string | undefined;
|
|
32
|
+
fitPosition: {
|
|
33
|
+
width: number;
|
|
34
|
+
height: number;
|
|
35
|
+
top: number;
|
|
36
|
+
left: number;
|
|
37
|
+
};
|
|
38
|
+
resolution: {
|
|
39
|
+
width: number;
|
|
40
|
+
height: number;
|
|
41
|
+
} | undefined;
|
|
42
|
+
scaleX: number;
|
|
43
|
+
scaleY: number;
|
|
44
|
+
onResize(): void;
|
|
45
|
+
hotspotStyle(hotspot: Hotspot): {
|
|
46
|
+
left: string;
|
|
47
|
+
top: string;
|
|
48
|
+
position: string;
|
|
49
|
+
};
|
|
27
50
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgViewerComponent, never>;
|
|
28
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<NgViewerComponent, "NgViewer", never, { "server": "server"; "api": "api"; "fit": "fit"; "scene": "scene"; "encoder": "encoder"; "parameters": "parameters"; "view": "view"; "vrcube": "vrcube"; "vrobject": "vrobject"; }, { "onLoadStart": "onLoadStart"; "onLoadProgress": "onLoadProgress"; "onLoadEnd": "onLoadEnd"; "onLoadError": "onLoadError"; "onInteraction": "onInteraction"; "onVrcubeInteraction": "onVrcubeInteraction"; "onVrobjectInteraction": "onVrobjectInteraction"; }, never, never>;
|
|
51
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgViewerComponent, "NgViewer", never, { "server": "server"; "api": "api"; "fit": "fit"; "scene": "scene"; "encoder": "encoder"; "parameters": "parameters"; "view": "view"; "vrcube": "vrcube"; "vrobject": "vrobject"; "tags": "tags"; "hotspotTemplateRef": "hotspotTemplateRef"; "hotspotsFilter": "hotspotsFilter"; }, { "onLoadStart": "onLoadStart"; "onLoadProgress": "onLoadProgress"; "onLoadEnd": "onLoadEnd"; "onLoadError": "onLoadError"; "onInteraction": "onInteraction"; "onVrcubeInteraction": "onVrcubeInteraction"; "onVrobjectInteraction": "onVrobjectInteraction"; }, never, never>;
|
|
29
52
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
2
|
import * as i1 from "./ng-viewer.component";
|
|
3
|
+
import * as i2 from "@angular/common";
|
|
3
4
|
export declare class NgViewerModule {
|
|
4
5
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgViewerModule, never>;
|
|
5
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<NgViewerModule, [typeof i1.NgViewerComponent],
|
|
6
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<NgViewerModule, [typeof i1.NgViewerComponent], [typeof i2.CommonModule], [typeof i1.NgViewerComponent]>;
|
|
6
7
|
static ɵinj: i0.ɵɵInjectorDeclaration<NgViewerModule>;
|
|
7
8
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare class Viewport {
|
|
2
|
+
static fit(resolution: any, viewportWidth: any, viewportHeight: any, fit: any): {
|
|
3
|
+
width: number;
|
|
4
|
+
height: number;
|
|
5
|
+
top: number;
|
|
6
|
+
left: number;
|
|
7
|
+
};
|
|
8
|
+
static getStandardAspectRatio(width: number, height: number): number;
|
|
9
|
+
static getStandardQuality(height: number): number;
|
|
10
|
+
static getStandardResolution(width: number, height: number): {
|
|
11
|
+
width: number;
|
|
12
|
+
height: number;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export default Viewport;
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lumiscaphe/ng-viewer",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.1.1",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/common": "^13.0.0",
|
|
6
6
|
"@angular/core": "^13.0.0",
|
|
7
|
-
"@lumiscaphe/viewer": "^
|
|
7
|
+
"@lumiscaphe/viewer": "^4.0.0"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"tslib": "^2.3.0"
|