angular-three-soba 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/abstractions/lib/catmull-rom-line.d.ts +148 -148
  2. package/abstractions/lib/edges.d.ts +166 -166
  3. package/abstractions/lib/grid.d.ts +30 -30
  4. package/abstractions/lib/line.d.ts +2 -2
  5. package/abstractions/lib/prism-geometry.d.ts +4 -4
  6. package/abstractions/lib/rounded-box.d.ts +1 -1
  7. package/abstractions/lib/text-3d.d.ts +37 -37
  8. package/abstractions/lib/text.d.ts +2 -2
  9. package/cameras/lib/cube-camera.d.ts +1 -1
  10. package/cameras/lib/orthographic-camera.d.ts +1 -1
  11. package/cameras/lib/perspective-camera.d.ts +1 -1
  12. package/controls/index.d.ts +9 -1
  13. package/controls/lib/camera-controls.d.ts +1 -1
  14. package/controls/lib/orbit-controls.d.ts +1 -1
  15. package/esm2022/controls/index.mjs +6 -2
  16. package/esm2022/gizmos/angular-three-soba-gizmos.mjs +5 -0
  17. package/esm2022/gizmos/index.mjs +6 -0
  18. package/esm2022/gizmos/lib/gizmo-helper/gizmo-helper.mjs +187 -0
  19. package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewcube.mjs +304 -0
  20. package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewport.mjs +332 -0
  21. package/esm2022/gizmos/lib/pivot-controls/axis-arrow.mjs +263 -0
  22. package/esm2022/gizmos/lib/pivot-controls/axis-rotator.mjs +264 -0
  23. package/esm2022/gizmos/lib/pivot-controls/pivot-controls.mjs +340 -0
  24. package/esm2022/gizmos/lib/pivot-controls/plane-slider.mjs +266 -0
  25. package/esm2022/gizmos/lib/pivot-controls/scaling-sphere.mjs +232 -0
  26. package/esm2022/gizmos/lib/transform-controls.mjs +177 -0
  27. package/esm2022/staging/index.mjs +2 -1
  28. package/esm2022/staging/lib/mask.mjs +78 -0
  29. package/fesm2022/angular-three-soba-controls.mjs +14 -1337
  30. package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
  31. package/fesm2022/angular-three-soba-gizmos.mjs +2319 -0
  32. package/fesm2022/angular-three-soba-gizmos.mjs.map +1 -0
  33. package/fesm2022/angular-three-soba-staging.mjs +92 -21
  34. package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
  35. package/gizmos/README.md +3 -0
  36. package/gizmos/index.d.ts +5 -0
  37. package/gizmos/lib/gizmo-helper/gizmo-helper.d.ts +45 -0
  38. package/gizmos/lib/gizmo-helper/gizmo-viewcube.d.ts +74 -0
  39. package/gizmos/lib/gizmo-helper/gizmo-viewport.d.ts +64 -0
  40. package/{controls → gizmos}/lib/pivot-controls/pivot-controls.d.ts +1 -1
  41. package/gizmos/lib/transform-controls.d.ts +50 -0
  42. package/materials/lib/custom-shader-material.d.ts +3 -3
  43. package/materials/lib/mesh-refraction-material.d.ts +3 -3
  44. package/materials/lib/mesh-transmission-material.d.ts +1 -1
  45. package/misc/lib/computed-attribute.d.ts +5 -5
  46. package/misc/lib/decal.d.ts +1 -1
  47. package/misc/lib/html/html.d.ts +1 -1
  48. package/misc/lib/sampler.d.ts +1 -1
  49. package/package.json +18 -12
  50. package/performances/lib/instances/instances.d.ts +9 -9
  51. package/performances/lib/points/points.d.ts +20 -20
  52. package/performances/lib/segments/segments.d.ts +4 -4
  53. package/shaders/lib/mesh-refraction-material.d.ts +2 -2
  54. package/staging/index.d.ts +1 -0
  55. package/staging/lib/caustics.d.ts +1 -1
  56. package/staging/lib/center.d.ts +2 -2
  57. package/staging/lib/contact-shadows.d.ts +1 -1
  58. package/staging/lib/lightformer.d.ts +1 -1
  59. package/staging/lib/mask.d.ts +30 -0
  60. package/staging/lib/render-texture.d.ts +1 -1
  61. package/staging/lib/sky.d.ts +1 -1
  62. package/staging/lib/spot-light.d.ts +2 -2
  63. package/staging/lib/stage.d.ts +6 -6
  64. package/esm2022/controls/lib/pivot-controls/axis-arrow.mjs +0 -263
  65. package/esm2022/controls/lib/pivot-controls/axis-rotator.mjs +0 -264
  66. package/esm2022/controls/lib/pivot-controls/pivot-controls.mjs +0 -340
  67. package/esm2022/controls/lib/pivot-controls/plane-slider.mjs +0 -266
  68. package/esm2022/controls/lib/pivot-controls/scaling-sphere.mjs +0 -232
  69. /package/{controls → gizmos}/lib/pivot-controls/axis-arrow.d.ts +0 -0
  70. /package/{controls → gizmos}/lib/pivot-controls/axis-rotator.d.ts +0 -0
  71. /package/{controls → gizmos}/lib/pivot-controls/plane-slider.d.ts +0 -0
  72. /package/{controls → gizmos}/lib/pivot-controls/scaling-sphere.d.ts +0 -0
@@ -0,0 +1,263 @@
1
+ import { ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, ElementRef, inject, input, signal, viewChild, } from '@angular/core';
2
+ import { extend, injectStore, NgtArgs } from 'angular-three';
3
+ import { NgtsLine } from 'angular-three-soba/abstractions';
4
+ import { NgtsHTML, NgtsHTMLContent } from 'angular-three-soba/misc';
5
+ import { ConeGeometry, CylinderGeometry, DoubleSide, Group, Matrix4, Mesh, MeshBasicMaterial, Quaternion, Vector3, } from 'three';
6
+ import { NgtsPivotControls } from './pivot-controls';
7
+ import * as i0 from "@angular/core";
8
+ const vec1 = new Vector3();
9
+ const vec2 = new Vector3();
10
+ export function calculateOffset(clickPoint, normal, rayStart, rayDir) {
11
+ const e1 = normal.dot(normal);
12
+ const e2 = normal.dot(clickPoint) - normal.dot(rayStart);
13
+ const e3 = normal.dot(rayDir);
14
+ if (e3 === 0) {
15
+ return -e2 / e1;
16
+ }
17
+ vec1
18
+ .copy(rayDir)
19
+ .multiplyScalar(e1 / e3)
20
+ .sub(normal);
21
+ vec2
22
+ .copy(rayDir)
23
+ .multiplyScalar(e2 / e3)
24
+ .add(rayStart)
25
+ .sub(clickPoint);
26
+ return -vec1.dot(vec2) / vec1.dot(vec1);
27
+ }
28
+ const upV = new Vector3(0, 1, 0);
29
+ const offsetMatrix = new Matrix4();
30
+ export class NgtsAxisArrow {
31
+ constructor() {
32
+ this.DoubleSide = DoubleSide;
33
+ this.direction = input.required();
34
+ this.axis = input.required();
35
+ this.groupRef = viewChild.required('group');
36
+ this.annotationRef = viewChild('annotation', { read: ElementRef });
37
+ this.pivotControls = inject(NgtsPivotControls);
38
+ this.store = injectStore();
39
+ this.controls = this.store.select('controls');
40
+ this.hovered = signal(false);
41
+ this.clickInfo = null;
42
+ this.offset0 = 0;
43
+ this.color = computed(() => this.hovered() ? this.pivotControls.hoveredColor() : this.pivotControls.axisColors()[this.axis()]);
44
+ this.coneWidth = computed(() => this.pivotControls.fixed()
45
+ ? (this.pivotControls.lineWidth() / this.pivotControls.scale()) * 1.6
46
+ : this.pivotControls.scale() / 20);
47
+ this.coneLength = computed(() => (this.pivotControls.fixed() ? 0.2 : this.pivotControls.scale() / 5));
48
+ this.cylinderLength = computed(() => this.pivotControls.fixed() ? 1 - this.coneLength() : this.pivotControls.scale() - this.coneLength());
49
+ this.matrixL = computed(() => {
50
+ const quaternion = new Quaternion().setFromUnitVectors(upV, this.direction().clone().normalize());
51
+ return new Matrix4().makeRotationFromQuaternion(quaternion);
52
+ });
53
+ extend({ Group, Mesh, ConeGeometry, CylinderGeometry, MeshBasicMaterial });
54
+ }
55
+ onPointerDown(event) {
56
+ const [group, direction, axis, controls, annotation] = [
57
+ this.groupRef().nativeElement,
58
+ this.direction(),
59
+ this.axis(),
60
+ this.controls(),
61
+ this.annotationRef()?.nativeElement,
62
+ ];
63
+ if (annotation) {
64
+ annotation.innerText = `${this.pivotControls.translation[axis].toFixed(2)}`;
65
+ annotation.style.display = 'block';
66
+ }
67
+ event.stopPropagation();
68
+ const rotation = new Matrix4().extractRotation(group.matrixWorld);
69
+ const origin = new Vector3().setFromMatrixPosition(group.matrixWorld);
70
+ const clickPoint = event.point.clone();
71
+ const dir = direction.clone().applyMatrix4(rotation).normalize();
72
+ this.clickInfo = { clickPoint, dir };
73
+ this.offset0 = this.pivotControls.translation[axis];
74
+ this.pivotControls.onDragStart({ component: 'Arrow', axis, origin, directions: [dir] });
75
+ if (controls) {
76
+ controls.enabled = false;
77
+ }
78
+ // @ts-expect-error - setPointerCapture is not in the type definition
79
+ event.target.setPointerCapture(event.pointerId);
80
+ }
81
+ onPointerUp(event) {
82
+ const [annotation, controls] = [this.annotationRef()?.nativeElement, this.controls()];
83
+ if (annotation) {
84
+ annotation.style.display = 'none';
85
+ }
86
+ event.stopPropagation();
87
+ this.clickInfo = null;
88
+ this.pivotControls.onDragEnd();
89
+ if (controls) {
90
+ controls.enabled = true;
91
+ }
92
+ // @ts-expect-error - setPointerCapture is not in the type definition
93
+ event.target.releasePointerCapture(event.pointerId);
94
+ }
95
+ onPointerMove(event) {
96
+ event.stopPropagation();
97
+ if (!this.hovered()) {
98
+ this.hovered.set(true);
99
+ }
100
+ if (this.clickInfo) {
101
+ const { clickPoint, dir } = this.clickInfo;
102
+ const [translationLimits, annotation, axis] = [
103
+ this.pivotControls.translationLimits(),
104
+ this.annotationRef()?.nativeElement,
105
+ this.axis(),
106
+ ];
107
+ const [min, max] = translationLimits?.[axis] || [undefined, undefined];
108
+ let offset = calculateOffset(clickPoint, dir, event.ray.origin, event.ray.direction);
109
+ if (min !== undefined) {
110
+ offset = Math.max(offset, min - this.offset0);
111
+ }
112
+ if (max !== undefined) {
113
+ offset = Math.min(offset, max - this.offset0);
114
+ }
115
+ this.pivotControls.translation[axis] = this.offset0 + offset;
116
+ if (annotation) {
117
+ annotation.innerText = `${this.pivotControls.translation[axis].toFixed(2)}`;
118
+ }
119
+ offsetMatrix.makeTranslation(dir.x * offset, dir.y * offset, dir.z * offset);
120
+ this.pivotControls.onDrag(offsetMatrix);
121
+ }
122
+ }
123
+ onPointerOut(event) {
124
+ event.stopPropagation();
125
+ this.hovered.set(false);
126
+ }
127
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsAxisArrow, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
128
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: NgtsAxisArrow, isStandalone: true, selector: "ngts-axis-arrow", inputs: { direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: true, transformFunction: null }, axis: { classPropertyName: "axis", publicName: "axis", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "groupRef", first: true, predicate: ["group"], descendants: true, isSignal: true }, { propertyName: "annotationRef", first: true, predicate: ["annotation"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: `
129
+ <ngt-group #group>
130
+ <ngt-group
131
+ [matrix]="matrixL()"
132
+ [matrixAutoUpdate]="false"
133
+ (pointerdown)="onPointerDown($any($event))"
134
+ (pointerup)="onPointerUp($any($event))"
135
+ (pointermove)="onPointerMove($any($event))"
136
+ (pointerout)="onPointerOut($any($event))"
137
+ >
138
+ @if (pivotControls.annotations()) {
139
+ <ngts-html [options]="{ position: [0, -coneLength(), 0] }">
140
+ <div
141
+ #annotation
142
+ ngtsHTMLContent
143
+ style="display: none; background: #151520; color: white; padding: 6px 8px; border-radius: 7px; white-space: nowrap;"
144
+ [class]="pivotControls.annotationsClass()"
145
+ ></div>
146
+ </ngts-html>
147
+ }
148
+ <ngt-mesh
149
+ [visible]="false"
150
+ [position]="[0, (cylinderLength() + coneLength()) / 2.0, 0]"
151
+ [userData]="pivotControls.userData()"
152
+ >
153
+ <ngt-cylinder-geometry
154
+ *args="[coneWidth() * 1.4, coneWidth() * 1.4, cylinderLength() + coneLength(), 8, 1]"
155
+ />
156
+ </ngt-mesh>
157
+
158
+ <ngts-line
159
+ [points]="[0, 0, 0, 0, cylinderLength(), 0]"
160
+ [options]="{
161
+ raycast: null,
162
+ side: DoubleSide,
163
+ polygonOffset: true,
164
+ polygonOffsetFactor: -10,
165
+ renderOrder: 1,
166
+ fog: false,
167
+ transparent: true,
168
+ lineWidth: pivotControls.lineWidth(),
169
+ color: color(),
170
+ opacity: pivotControls.opacity(),
171
+ depthTest: pivotControls.depthTest(),
172
+ }"
173
+ />
174
+
175
+ <ngt-mesh [raycast]="null" [position]="[0, cylinderLength() + coneLength() / 2.0, 0]" [renderOrder]="500">
176
+ <ngt-cone-geometry *args="[coneWidth(), coneLength(), 24, 1]" />
177
+ <ngt-mesh-basic-material
178
+ [transparent]="true"
179
+ [depthTest]="pivotControls.depthTest()"
180
+ [color]="color()"
181
+ [opacity]="pivotControls.opacity()"
182
+ [polygonOffset]="true"
183
+ [polygonOffsetFactor]="-10"
184
+ [fog]="false"
185
+ />
186
+ </ngt-mesh>
187
+ </ngt-group>
188
+ </ngt-group>
189
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtsLine, selector: "ngts-line", inputs: ["points", "options"] }, { kind: "component", type: NgtsHTML, selector: "ngts-html", inputs: ["options"] }, { kind: "component", type: NgtsHTMLContent, selector: "[ngtsHTMLContent]", inputs: ["ngtsHTMLContent"], outputs: ["occluded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
190
+ }
191
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsAxisArrow, decorators: [{
192
+ type: Component,
193
+ args: [{
194
+ selector: 'ngts-axis-arrow',
195
+ standalone: true,
196
+ template: `
197
+ <ngt-group #group>
198
+ <ngt-group
199
+ [matrix]="matrixL()"
200
+ [matrixAutoUpdate]="false"
201
+ (pointerdown)="onPointerDown($any($event))"
202
+ (pointerup)="onPointerUp($any($event))"
203
+ (pointermove)="onPointerMove($any($event))"
204
+ (pointerout)="onPointerOut($any($event))"
205
+ >
206
+ @if (pivotControls.annotations()) {
207
+ <ngts-html [options]="{ position: [0, -coneLength(), 0] }">
208
+ <div
209
+ #annotation
210
+ ngtsHTMLContent
211
+ style="display: none; background: #151520; color: white; padding: 6px 8px; border-radius: 7px; white-space: nowrap;"
212
+ [class]="pivotControls.annotationsClass()"
213
+ ></div>
214
+ </ngts-html>
215
+ }
216
+ <ngt-mesh
217
+ [visible]="false"
218
+ [position]="[0, (cylinderLength() + coneLength()) / 2.0, 0]"
219
+ [userData]="pivotControls.userData()"
220
+ >
221
+ <ngt-cylinder-geometry
222
+ *args="[coneWidth() * 1.4, coneWidth() * 1.4, cylinderLength() + coneLength(), 8, 1]"
223
+ />
224
+ </ngt-mesh>
225
+
226
+ <ngts-line
227
+ [points]="[0, 0, 0, 0, cylinderLength(), 0]"
228
+ [options]="{
229
+ raycast: null,
230
+ side: DoubleSide,
231
+ polygonOffset: true,
232
+ polygonOffsetFactor: -10,
233
+ renderOrder: 1,
234
+ fog: false,
235
+ transparent: true,
236
+ lineWidth: pivotControls.lineWidth(),
237
+ color: color(),
238
+ opacity: pivotControls.opacity(),
239
+ depthTest: pivotControls.depthTest(),
240
+ }"
241
+ />
242
+
243
+ <ngt-mesh [raycast]="null" [position]="[0, cylinderLength() + coneLength() / 2.0, 0]" [renderOrder]="500">
244
+ <ngt-cone-geometry *args="[coneWidth(), coneLength(), 24, 1]" />
245
+ <ngt-mesh-basic-material
246
+ [transparent]="true"
247
+ [depthTest]="pivotControls.depthTest()"
248
+ [color]="color()"
249
+ [opacity]="pivotControls.opacity()"
250
+ [polygonOffset]="true"
251
+ [polygonOffsetFactor]="-10"
252
+ [fog]="false"
253
+ />
254
+ </ngt-mesh>
255
+ </ngt-group>
256
+ </ngt-group>
257
+ `,
258
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
259
+ changeDetection: ChangeDetectionStrategy.OnPush,
260
+ imports: [NgtArgs, NgtsLine, NgtsHTML, NgtsHTMLContent],
261
+ }]
262
+ }], ctorParameters: () => [] });
263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXhpcy1hcnJvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc29iYS9naXptb3Mvc3JjL2xpYi9waXZvdC1jb250cm9scy9heGlzLWFycm93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUVOLFNBQVMsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BFLE9BQU8sRUFDTixZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixLQUFLLEVBQ0wsT0FBTyxFQUNQLElBQUksRUFDSixpQkFBaUIsRUFDakIsVUFBVSxFQUNWLE9BQU8sR0FDUCxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDOztBQUVyRCxNQUFNLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQzNCLE1BQU0sSUFBSSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7QUFFM0IsTUFBTSxVQUFVLGVBQWUsQ0FBQyxVQUFtQixFQUFFLE1BQWUsRUFBRSxRQUFpQixFQUFFLE1BQWU7SUFDdkcsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QixNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFB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LE9BQU8sZ0ZBQUUsUUFBUSxxRkFBRSxRQUFRLDJFQUFFLGVBQWU7OzJGQUUxQyxhQUFhO2tCQXJFekIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBNkRUO29CQUNELE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO29CQUNqQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDO2lCQUN2RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuXHRDb21wb25lbnQsXG5cdGNvbXB1dGVkLFxuXHRDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxuXHRFbGVtZW50UmVmLFxuXHRpbmplY3QsXG5cdGlucHV0LFxuXHRzaWduYWwsXG5cdFNpZ25hbCxcblx0dmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGV4dGVuZCwgaW5qZWN0U3RvcmUsIE5ndEFyZ3MsIE5ndFRocmVlRXZlbnQgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IE5ndHNMaW5lIH0gZnJvbSAnYW5ndWxhci10aHJlZS1zb2JhL2Fic3RyYWN0aW9ucyc7XG5pbXBvcnQgeyBOZ3RzSFRNTCwgTmd0c0hUTUxDb250ZW50IH0gZnJvbSAnYW5ndWxhci10aHJlZS1zb2JhL21pc2MnO1xuaW1wb3J0IHtcblx0Q29uZUdlb21ldHJ5LFxuXHRDeWxpbmRlckdlb21ldHJ5LFxuXHREb3VibGVTaWRlLFxuXHRHcm91cCxcblx0TWF0cml4NCxcblx0TWVzaCxcblx0TWVzaEJhc2ljTWF0ZXJpYWwsXG5cdFF1YXRlcm5pb24sXG5cdFZlY3RvcjMsXG59IGZyb20gJ3RocmVlJztcbmltcG9ydCB7IE5ndHNQaXZvdENvbnRyb2xzIH0gZnJvbSAnLi9waXZvdC1jb250cm9scyc7XG5cbmNvbnN0IHZlYzEgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgdmVjMiA9IG5ldyBWZWN0b3IzKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVPZmZzZXQoY2xpY2tQb2ludDogVmVjdG9yMywgbm9ybWFsOiBWZWN0b3IzLCByYXlTdGFydDogVmVjdG9yMywgcmF5RGlyOiBWZWN0b3IzKSB7XG5cdGNvbnN0IGUxID0gbm9ybWFsLmRvdChub3JtYWwpO1xuXHRjb25zdCBlMiA9IG5vcm1hbC5kb3QoY2xpY2tQb2ludCkgLSBub3JtYWwuZG90KHJheVN0YXJ0KTtcblx0Y29uc3QgZTMgPSBub3JtYWwuZG90KHJheURpcik7XG5cblx0aWYgKGUzID09PSAwKSB7XG5cdFx0cmV0dXJuIC1lMiAvIGUxO1xuXHR9XG5cblx0dmVjMVxuXHRcdC5jb3B5KHJheURpcilcblx0XHQubXVsdGlwbHlTY2FsYXIoZTEgLyBlMylcblx0XHQuc3ViKG5vcm1hbCk7XG5cdHZlYzJcblx0XHQuY29weShyYXlEaXIpXG5cdFx0Lm11bHRpcGx5U2NhbGFyKGUyIC8gZTMpXG5cdFx0LmFkZChyYXlTdGFydClcblx0XHQuc3ViKGNsaWNrUG9pbnQpO1xuXG5cdHJldHVybiAtdmVjMS5kb3QodmVjMikgLyB2ZWMxLmRvdCh2ZWMxKTtcbn1cblxuY29uc3QgdXBWID0gbmV3IFZlY3RvcjMoMCwgMSwgMCk7XG5jb25zdCBvZmZzZXRNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3RzLWF4aXMtYXJyb3cnLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZ3QtZ3JvdXAgI2dyb3VwPlxuXHRcdFx0PG5ndC1ncm91cFxuXHRcdFx0XHRbbWF0cml4XT1cIm1hdHJpeEwoKVwiXG5cdFx0XHRcdFttYXRyaXhBdXRvVXBkYXRlXT1cImZhbHNlXCJcblx0XHRcdFx0KHBvaW50ZXJkb3duKT1cIm9uUG9pbnRlckRvd24oJGFueSgkZXZlbnQpKVwiXG5cdFx0XHRcdChwb2ludGVydXApPVwib25Qb2ludGVyVXAoJGFueSgkZXZlbnQpKVwiXG5cdFx0XHRcdChwb2ludGVybW92ZSk9XCJvblBvaW50ZXJNb3ZlKCRhbnkoJGV2ZW50KSlcIlxuXHRcdFx0XHQocG9pbnRlcm91dCk9XCJvblBvaW50ZXJPdXQoJGFueSgkZXZlbnQpKVwiXG5cdFx0XHQ+XG5cdFx0XHRcdEBpZiAocGl2b3RDb250cm9scy5hbm5vdGF0aW9ucygpKSB7XG5cdFx0XHRcdFx0PG5ndHMtaHRtbCBbb3B0aW9uc109XCJ7IHBvc2l0aW9uOiBbMCwgLWNvbmVMZW5ndGgoKSwgMF0gfVwiPlxuXHRcdFx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdFx0XHQjYW5ub3RhdGlvblxuXHRcdFx0XHRcdFx0XHRuZ3RzSFRNTENvbnRlbnRcblx0XHRcdFx0XHRcdFx0c3R5bGU9XCJkaXNwbGF5OiBub25lOyBiYWNrZ3JvdW5kOiAjMTUxNTIwOyBjb2xvcjogd2hpdGU7IHBhZGRpbmc6IDZweCA4cHg7IGJvcmRlci1yYWRpdXM6IDdweDsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIlxuXHRcdFx0XHRcdFx0XHRbY2xhc3NdPVwicGl2b3RDb250cm9scy5hbm5vdGF0aW9uc0NsYXNzKClcIlxuXHRcdFx0XHRcdFx0PjwvZGl2PlxuXHRcdFx0XHRcdDwvbmd0cy1odG1sPlxuXHRcdFx0XHR9XG5cdFx0XHRcdDxuZ3QtbWVzaFxuXHRcdFx0XHRcdFt2aXNpYmxlXT1cImZhbHNlXCJcblx0XHRcdFx0XHRbcG9zaXRpb25dPVwiWzAsIChjeWxpbmRlckxlbmd0aCgpICsgY29uZUxlbmd0aCgpKSAvIDIuMCwgMF1cIlxuXHRcdFx0XHRcdFt1c2VyRGF0YV09XCJwaXZvdENvbnRyb2xzLnVzZXJEYXRhKClcIlxuXHRcdFx0XHQ+XG5cdFx0XHRcdFx0PG5ndC1jeWxpbmRlci1nZW9tZXRyeVxuXHRcdFx0XHRcdFx0KmFyZ3M9XCJbY29uZVdpZHRoKCkgKiAxLjQsIGNvbmVXaWR0aCgpICogMS40LCBjeWxpbmRlckxlbmd0aCgpICsgY29uZUxlbmd0aCgpLCA4LCAxXVwiXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0PC9uZ3QtbWVzaD5cblxuXHRcdFx0XHQ8bmd0cy1saW5lXG5cdFx0XHRcdFx0W3BvaW50c109XCJbMCwgMCwgMCwgMCwgY3lsaW5kZXJMZW5ndGgoKSwgMF1cIlxuXHRcdFx0XHRcdFtvcHRpb25zXT1cIntcblx0XHRcdFx0XHRcdHJheWNhc3Q6IG51bGwsXG5cdFx0XHRcdFx0XHRzaWRlOiBEb3VibGVTaWRlLFxuXHRcdFx0XHRcdFx0cG9seWdvbk9mZnNldDogdHJ1ZSxcblx0XHRcdFx0XHRcdHBvbHlnb25PZmZzZXRGYWN0b3I6IC0xMCxcblx0XHRcdFx0XHRcdHJlbmRlck9yZGVyOiAxLFxuXHRcdFx0XHRcdFx0Zm9nOiBmYWxzZSxcblx0XHRcdFx0XHRcdHRyYW5zcGFyZW50OiB0cnVlLFxuXHRcdFx0XHRcdFx0bGluZVdpZHRoOiBwaXZvdENvbnRyb2xzLmxpbmVXaWR0aCgpLFxuXHRcdFx0XHRcdFx0Y29sb3I6IGNvbG9yKCksXG5cdFx0XHRcdFx0XHRvcGFjaXR5OiBwaXZvdENvbnRyb2xzLm9wYWNpdHkoKSxcblx0XHRcdFx0XHRcdGRlcHRoVGVzdDogcGl2b3RDb250cm9scy5kZXB0aFRlc3QoKSxcblx0XHRcdFx0XHR9XCJcblx0XHRcdFx0Lz5cblxuXHRcdFx0XHQ8bmd0LW1lc2ggW3JheWNhc3RdPVwibnVsbFwiIFtwb3NpdGlvbl09XCJbMCwgY3lsaW5kZXJMZW5ndGgoKSArIGNvbmVMZW5ndGgoKSAvIDIuMCwgMF1cIiBbcmVuZGVyT3JkZXJdPVwiNTAwXCI+XG5cdFx0XHRcdFx0PG5ndC1jb25lLWdlb21ldHJ5ICphcmdzPVwiW2NvbmVXaWR0aCgpLCBjb25lTGVuZ3RoKCksIDI0LCAxXVwiIC8+XG5cdFx0XHRcdFx0PG5ndC1tZXNoLWJhc2ljLW1hdGVyaWFsXG5cdFx0XHRcdFx0XHRbdHJhbnNwYXJlbnRdPVwidHJ1ZVwiXG5cdFx0XHRcdFx0XHRbZGVwdGhUZXN0XT1cInBpdm90Q29udHJvbHMuZGVwdGhUZXN0KClcIlxuXHRcdFx0XHRcdFx0W2NvbG9yXT1cImNvbG9yKClcIlxuXHRcdFx0XHRcdFx0W29wYWNpdHldPVwicGl2b3RDb250cm9scy5vcGFjaXR5KClcIlxuXHRcdFx0XHRcdFx0W3BvbHlnb25PZmZzZXRdPVwidHJ1ZVwiXG5cdFx0XHRcdFx0XHRbcG9seWdvbk9mZnNldEZhY3Rvcl09XCItMTBcIlxuXHRcdFx0XHRcdFx0W2ZvZ109XCJmYWxzZVwiXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0PC9uZ3QtbWVzaD5cblx0XHRcdDwvbmd0LWdyb3VwPlxuXHRcdDwvbmd0LWdyb3VwPlxuXHRgLFxuXHRzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuXHRpbXBvcnRzOiBbTmd0QXJncywgTmd0c0xpbmUsIE5ndHNIVE1MLCBOZ3RzSFRNTENvbnRlbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzQXhpc0Fycm93IHtcblx0cHJvdGVjdGVkIHJlYWRvbmx5IERvdWJsZVNpZGUgPSBEb3VibGVTaWRlO1xuXG5cdGRpcmVjdGlvbiA9IGlucHV0LnJlcXVpcmVkPFZlY3RvcjM+KCk7XG5cdGF4aXMgPSBpbnB1dC5yZXF1aXJlZDwwIHwgMSB8IDI+KCk7XG5cblx0Z3JvdXBSZWYgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxHcm91cD4+KCdncm91cCcpO1xuXHRhbm5vdGF0aW9uUmVmID0gdmlld0NoaWxkPHVua25vd24sIEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignYW5ub3RhdGlvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcblxuXHRwaXZvdENvbnRyb2xzID0gaW5qZWN0KE5ndHNQaXZvdENvbnRyb2xzKTtcblx0cHJpdmF0ZSBzdG9yZSA9IGluamVjdFN0b3JlKCk7XG5cdHByaXZhdGUgY29udHJvbHMgPSB0aGlzLnN0b3JlLnNlbGVjdCgnY29udHJvbHMnKSBhcyB1bmtub3duIGFzIFNpZ25hbDx7IGVuYWJsZWQ6IGJvb2xlYW4gfT47XG5cblx0cHJpdmF0ZSBob3ZlcmVkID0gc2lnbmFsKGZhbHNlKTtcblx0cHJpdmF0ZSBjbGlja0luZm86IHsgY2xpY2tQb2ludDogVmVjdG9yMzsgZGlyOiBWZWN0b3IzIH0gfCBudWxsID0gbnVsbDtcblx0cHJpdmF0ZSBvZmZzZXQwID0gMDtcblxuXHRjb2xvciA9IGNvbXB1dGVkKCgpID0+XG5cdFx0dGhpcy5ob3ZlcmVkKCkgPyB0aGlzLnBpdm90Q29udHJvbHMuaG92ZXJlZENvbG9yKCkgOiB0aGlzLnBpdm90Q29udHJvbHMuYXhpc0NvbG9ycygpW3RoaXMuYXhpcygpXSxcblx0KTtcblxuXHRjb25lV2lkdGggPSBjb21wdXRlZCgoKSA9PlxuXHRcdHRoaXMucGl2b3RDb250cm9scy5maXhlZCgpXG5cdFx0XHQ/ICh0aGlzLnBpdm90Q29udHJvbHMubGluZVdpZHRoKCkgLyB0aGlzLnBpdm90Q29udHJvbHMuc2NhbGUoKSkgKiAxLjZcblx0XHRcdDogdGhpcy5waXZvdENvbnRyb2xzLnNjYWxlKCkgLyAyMCxcblx0KTtcblx0Y29uZUxlbmd0aCA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLnBpdm90Q29udHJvbHMuZml4ZWQoKSA/IDAuMiA6IHRoaXMucGl2b3RDb250cm9scy5zY2FsZSgpIC8gNSkpO1xuXHRjeWxpbmRlckxlbmd0aCA9IGNvbXB1dGVkKCgpID0+XG5cdFx0dGhpcy5waXZvdENvbnRyb2xzLmZpeGVkKCkgPyAxIC0gdGhpcy5jb25lTGVuZ3RoKCkgOiB0aGlzLnBpdm90Q29udHJvbHMuc2NhbGUoKSAtIHRoaXMuY29uZUxlbmd0aCgpLFxuXHQpO1xuXHRtYXRyaXhMID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpLnNldEZyb21Vbml0VmVjdG9ycyh1cFYsIHRoaXMuZGlyZWN0aW9uKCkuY2xvbmUoKS5ub3JtYWxpemUoKSk7XG5cdFx0cmV0dXJuIG5ldyBNYXRyaXg0KCkubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24ocXVhdGVybmlvbik7XG5cdH0pO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGV4dGVuZCh7IEdyb3VwLCBNZXNoLCBDb25lR2VvbWV0cnksIEN5bGluZGVyR2VvbWV0cnksIE1lc2hCYXNpY01hdGVyaWFsIH0pO1xuXHR9XG5cblx0b25Qb2ludGVyRG93bihldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSB7XG5cdFx0Y29uc3QgW2dyb3VwLCBkaXJlY3Rpb24sIGF4aXMsIGNvbnRyb2xzLCBhbm5vdGF0aW9uXSA9IFtcblx0XHRcdHRoaXMuZ3JvdXBSZWYoKS5uYXRpdmVFbGVtZW50LFxuXHRcdFx0dGhpcy5kaXJlY3Rpb24oKSxcblx0XHRcdHRoaXMuYXhpcygpLFxuXHRcdFx0dGhpcy5jb250cm9scygpLFxuXHRcdFx0dGhpcy5hbm5vdGF0aW9uUmVmKCk/Lm5hdGl2ZUVsZW1lbnQsXG5cdFx0XTtcblxuXHRcdGlmIChhbm5vdGF0aW9uKSB7XG5cdFx0XHRhbm5vdGF0aW9uLmlubmVyVGV4dCA9IGAke3RoaXMucGl2b3RDb250cm9scy50cmFuc2xhdGlvbltheGlzXS50b0ZpeGVkKDIpfWA7XG5cdFx0XHRhbm5vdGF0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXHRcdH1cblxuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0Y29uc3Qgcm90YXRpb24gPSBuZXcgTWF0cml4NCgpLmV4dHJhY3RSb3RhdGlvbihncm91cC5tYXRyaXhXb3JsZCk7XG5cdFx0Y29uc3Qgb3JpZ2luID0gbmV3IFZlY3RvcjMoKS5zZXRGcm9tTWF0cml4UG9zaXRpb24oZ3JvdXAubWF0cml4V29ybGQpO1xuXHRcdGNvbnN0IGNsaWNrUG9pbnQgPSBldmVudC5wb2ludC5jbG9uZSgpO1xuXHRcdGNvbnN0IGRpciA9IGRpcmVjdGlvbi5jbG9uZSgpLmFwcGx5TWF0cml4NChyb3RhdGlvbikubm9ybWFsaXplKCk7XG5cdFx0dGhpcy5jbGlja0luZm8gPSB7IGNsaWNrUG9pbnQsIGRpciB9O1xuXHRcdHRoaXMub2Zmc2V0MCA9IHRoaXMucGl2b3RDb250cm9scy50cmFuc2xhdGlvbltheGlzXTtcblx0XHR0aGlzLnBpdm90Q29udHJvbHMub25EcmFnU3RhcnQoeyBjb21wb25lbnQ6ICdBcnJvdycsIGF4aXMsIG9yaWdpbiwgZGlyZWN0aW9uczogW2Rpcl0gfSk7XG5cdFx0aWYgKGNvbnRyb2xzKSB7XG5cdFx0XHRjb250cm9scy5lbmFibGVkID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciAtIHNldFBvaW50ZXJDYXB0dXJlIGlzIG5vdCBpbiB0aGUgdHlwZSBkZWZpbml0aW9uXG5cdFx0ZXZlbnQudGFyZ2V0LnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XG5cdH1cblxuXHRvblBvaW50ZXJVcChldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSB7XG5cdFx0Y29uc3QgW2Fubm90YXRpb24sIGNvbnRyb2xzXSA9IFt0aGlzLmFubm90YXRpb25SZWYoKT8ubmF0aXZlRWxlbWVudCwgdGhpcy5jb250cm9scygpXTtcblxuXHRcdGlmIChhbm5vdGF0aW9uKSB7XG5cdFx0XHRhbm5vdGF0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0fVxuXG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0dGhpcy5jbGlja0luZm8gPSBudWxsO1xuXHRcdHRoaXMucGl2b3RDb250cm9scy5vbkRyYWdFbmQoKTtcblx0XHRpZiAoY29udHJvbHMpIHtcblx0XHRcdGNvbnRyb2xzLmVuYWJsZWQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgLSBzZXRQb2ludGVyQ2FwdHVyZSBpcyBub3QgaW4gdGhlIHR5cGUgZGVmaW5pdGlvblxuXHRcdGV2ZW50LnRhcmdldC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTtcblx0fVxuXG5cdG9uUG9pbnRlck1vdmUoZXZlbnQ6IE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pikge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0aWYgKCF0aGlzLmhvdmVyZWQoKSkge1xuXHRcdFx0dGhpcy5ob3ZlcmVkLnNldCh0cnVlKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jbGlja0luZm8pIHtcblx0XHRcdGNvbnN0IHsgY2xpY2tQb2ludCwgZGlyIH0gPSB0aGlzLmNsaWNrSW5mbztcblx0XHRcdGNvbnN0IFt0cmFuc2xhdGlvbkxpbWl0cywgYW5ub3RhdGlvbiwgYXhpc10gPSBbXG5cdFx0XHRcdHRoaXMucGl2b3RDb250cm9scy50cmFuc2xhdGlvbkxpbWl0cygpLFxuXHRcdFx0XHR0aGlzLmFubm90YXRpb25SZWYoKT8ubmF0aXZlRWxlbWVudCxcblx0XHRcdFx0dGhpcy5heGlzKCksXG5cdFx0XHRdO1xuXG5cdFx0XHRjb25zdCBbbWluLCBtYXhdID0gdHJhbnNsYXRpb25MaW1pdHM/LltheGlzXSB8fCBbdW5kZWZpbmVkLCB1bmRlZmluZWRdO1xuXG5cdFx0XHRsZXQgb2Zmc2V0ID0gY2FsY3VsYXRlT2Zmc2V0KGNsaWNrUG9pbnQsIGRpciwgZXZlbnQucmF5Lm9yaWdpbiwgZXZlbnQucmF5LmRpcmVjdGlvbik7XG5cdFx0XHRpZiAobWluICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0b2Zmc2V0ID0gTWF0aC5tYXgob2Zmc2V0LCBtaW4gLSB0aGlzLm9mZnNldDApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobWF4ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0b2Zmc2V0ID0gTWF0aC5taW4ob2Zmc2V0LCBtYXggLSB0aGlzLm9mZnNldDApO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnBpdm90Q29udHJvbHMudHJhbnNsYXRpb25bYXhpc10gPSB0aGlzLm9mZnNldDAgKyBvZmZzZXQ7XG5cblx0XHRcdGlmIChhbm5vdGF0aW9uKSB7XG5cdFx0XHRcdGFubm90YXRpb24uaW5uZXJUZXh0ID0gYCR7dGhpcy5waXZvdENvbnRyb2xzLnRyYW5zbGF0aW9uW2F4aXNdLnRvRml4ZWQoMil9YDtcblx0XHRcdH1cblxuXHRcdFx0b2Zmc2V0TWF0cml4Lm1ha2VUcmFuc2xhdGlvbihkaXIueCAqIG9mZnNldCwgZGlyLnkgKiBvZmZzZXQsIGRpci56ICogb2Zmc2V0KTtcblx0XHRcdHRoaXMucGl2b3RDb250cm9scy5vbkRyYWcob2Zmc2V0TWF0cml4KTtcblx0XHR9XG5cdH1cblxuXHRvblBvaW50ZXJPdXQoZXZlbnQ6IE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pikge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdHRoaXMuaG92ZXJlZC5zZXQoZmFsc2UpO1xuXHR9XG59XG4iXX0=
@@ -0,0 +1,264 @@
1
+ import { ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, ElementRef, inject, input, signal, viewChild, } from '@angular/core';
2
+ import { extend, injectStore } from 'angular-three';
3
+ import { NgtsLine } from 'angular-three-soba/abstractions';
4
+ import { NgtsHTML, NgtsHTMLContent } from 'angular-three-soba/misc';
5
+ import { DoubleSide, Group, Matrix4, Plane, Ray, Vector3 } from 'three';
6
+ import { NgtsPivotControls } from './pivot-controls';
7
+ import * as i0 from "@angular/core";
8
+ const clickDir = new Vector3();
9
+ const intersectionDir = new Vector3();
10
+ function toDegrees(radians) {
11
+ return (radians * 180) / Math.PI;
12
+ }
13
+ function toRadians(degrees) {
14
+ return (degrees * Math.PI) / 180;
15
+ }
16
+ function calculateAngle(clickPoint, intersectionPoint, origin, e1, e2) {
17
+ clickDir.copy(clickPoint).sub(origin);
18
+ intersectionDir.copy(intersectionPoint).sub(origin);
19
+ const dote1e1 = e1.dot(e1);
20
+ const dote2e2 = e2.dot(e2);
21
+ const uClick = clickDir.dot(e1) / dote1e1;
22
+ const vClick = clickDir.dot(e2) / dote2e2;
23
+ const uIntersection = intersectionDir.dot(e1) / dote1e1;
24
+ const vIntersection = intersectionDir.dot(e2) / dote2e2;
25
+ const angleClick = Math.atan2(vClick, uClick);
26
+ const angleIntersection = Math.atan2(vIntersection, uIntersection);
27
+ return angleIntersection - angleClick;
28
+ }
29
+ function fmod(num, denom) {
30
+ let k = Math.floor(num / denom);
31
+ k = k < 0 ? k + 1 : k;
32
+ return num - k * denom;
33
+ }
34
+ function minimizeAngle(angle) {
35
+ let result = fmod(angle, 2 * Math.PI);
36
+ if (Math.abs(result) < 1e-6) {
37
+ return 0.0;
38
+ }
39
+ if (result < 0.0) {
40
+ result += 2 * Math.PI;
41
+ }
42
+ return result;
43
+ }
44
+ const rotMatrix = new Matrix4();
45
+ const posNew = new Vector3();
46
+ const ray = new Ray();
47
+ const intersection = new Vector3();
48
+ export class NgtsAxisRotator {
49
+ constructor() {
50
+ this.DoubleSide = DoubleSide;
51
+ this.dir1 = input.required();
52
+ this.dir2 = input.required();
53
+ this.axis = input.required();
54
+ this.groupRef = viewChild.required('group');
55
+ this.annotationRef = viewChild('annotation', { read: ElementRef });
56
+ this.pivotControls = inject(NgtsPivotControls);
57
+ this.store = injectStore();
58
+ this.controls = this.store.select('controls');
59
+ this.hovered = signal(false);
60
+ this.angle = 0;
61
+ this.angle0 = 0;
62
+ this.clickInfo = null;
63
+ this.matrixL = computed(() => {
64
+ const dir1N = this.dir1().clone().normalize();
65
+ const dir2N = this.dir2().clone().normalize();
66
+ return new Matrix4().makeBasis(dir1N, dir2N, dir1N.clone().cross(dir2N));
67
+ });
68
+ this.r = computed(() => (this.pivotControls.fixed() ? 0.65 : this.pivotControls.scale() * 0.65));
69
+ this.arc = computed(() => {
70
+ const segments = 32;
71
+ const points = [];
72
+ for (let j = 0; j <= segments; j++) {
73
+ const angle = (j * (Math.PI / 2)) / segments;
74
+ points.push(new Vector3(Math.cos(angle) * this.r(), Math.sin(angle) * this.r(), 0));
75
+ }
76
+ return points;
77
+ });
78
+ extend({ Group });
79
+ }
80
+ onPointerDown(event) {
81
+ const [annotation, group, axis, controls] = [
82
+ this.annotationRef()?.nativeElement,
83
+ this.groupRef().nativeElement,
84
+ this.axis(),
85
+ this.controls(),
86
+ ];
87
+ if (annotation) {
88
+ annotation.innerText = `${toDegrees(this.angle).toFixed(0)}º`;
89
+ annotation.style.display = 'block';
90
+ }
91
+ event.stopPropagation();
92
+ const clickPoint = event.point.clone();
93
+ const origin = new Vector3().setFromMatrixPosition(group.matrixWorld);
94
+ const e1 = new Vector3().setFromMatrixColumn(group.matrixWorld, 0).normalize();
95
+ const e2 = new Vector3().setFromMatrixColumn(group.matrixWorld, 1).normalize();
96
+ const normal = new Vector3().setFromMatrixColumn(group.matrixWorld, 2).normalize();
97
+ const plane = new Plane().setFromNormalAndCoplanarPoint(normal, origin);
98
+ this.clickInfo = { clickPoint, origin, e1, e2, normal, plane };
99
+ this.pivotControls.onDragStart({ component: 'Rotator', axis, origin, directions: [e1, e2, normal] });
100
+ if (controls) {
101
+ controls.enabled = false;
102
+ }
103
+ // @ts-expect-error - setPointerCapture is not a function on PointerEvent
104
+ event.target.setPointerCapture(event.pointerId);
105
+ }
106
+ onPointerMove(event) {
107
+ event.stopPropagation();
108
+ if (!this.hovered())
109
+ this.hovered.set(true);
110
+ if (this.clickInfo) {
111
+ const { clickPoint, origin, e1, e2, normal, plane } = this.clickInfo;
112
+ const [rotationLimits, axis, annotation] = [
113
+ this.pivotControls.rotationLimits(),
114
+ this.axis(),
115
+ this.annotationRef()?.nativeElement,
116
+ ];
117
+ const [min, max] = rotationLimits?.[axis] || [undefined, undefined];
118
+ ray.copy(event.ray);
119
+ ray.intersectPlane(plane, intersection);
120
+ ray.direction.negate();
121
+ ray.intersectPlane(plane, intersection);
122
+ let deltaAngle = calculateAngle(clickPoint, intersection, origin, e1, e2);
123
+ let degrees = toDegrees(deltaAngle);
124
+ if (event.shiftKey) {
125
+ degrees = Math.round(degrees / 10) * 10;
126
+ deltaAngle = toRadians(degrees);
127
+ }
128
+ if (min !== undefined && max !== undefined && max - min < 2 * Math.PI) {
129
+ deltaAngle = minimizeAngle(deltaAngle);
130
+ deltaAngle = deltaAngle > Math.PI ? deltaAngle - 2 * Math.PI : deltaAngle;
131
+ deltaAngle = Math.round(deltaAngle / 10) * 10;
132
+ this.angle = this.angle0 + deltaAngle;
133
+ }
134
+ else {
135
+ this.angle = minimizeAngle(this.angle0 + deltaAngle);
136
+ this.angle = this.angle > Math.PI ? this.angle - 2 * Math.PI : this.angle;
137
+ }
138
+ if (annotation) {
139
+ degrees = toDegrees(this.angle);
140
+ annotation.innerText = `${degrees.toFixed(0)}º`;
141
+ }
142
+ rotMatrix.makeRotationAxis(normal, deltaAngle);
143
+ posNew.copy(origin).applyMatrix4(rotMatrix).sub(origin).negate();
144
+ rotMatrix.setPosition(posNew);
145
+ this.pivotControls.onDrag(rotMatrix);
146
+ }
147
+ }
148
+ onPointerUp(event) {
149
+ const [annotation, controls] = [this.annotationRef()?.nativeElement, this.controls()];
150
+ if (annotation) {
151
+ annotation.style.display = 'none';
152
+ }
153
+ event.stopPropagation();
154
+ this.clickInfo = null;
155
+ this.pivotControls.onDragEnd();
156
+ if (controls) {
157
+ controls.enabled = true;
158
+ }
159
+ // @ts-expect-error - releasePointerCapture is not a function on PointerEvent
160
+ event.target.releasePointerCapture(event.pointerId);
161
+ }
162
+ onPointerOut(event) {
163
+ event.stopPropagation();
164
+ this.hovered.set(false);
165
+ }
166
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsAxisRotator, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
167
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: NgtsAxisRotator, isStandalone: true, selector: "ngts-axis-rotator", inputs: { dir1: { classPropertyName: "dir1", publicName: "dir1", isSignal: true, isRequired: true, transformFunction: null }, dir2: { classPropertyName: "dir2", publicName: "dir2", isSignal: true, isRequired: true, transformFunction: null }, axis: { classPropertyName: "axis", publicName: "axis", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "groupRef", first: true, predicate: ["group"], descendants: true, isSignal: true }, { propertyName: "annotationRef", first: true, predicate: ["annotation"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: `
168
+ <ngt-group
169
+ #group
170
+ [matrix]="matrixL()"
171
+ [matrixAutoUpdate]="false"
172
+ (pointerdown)="onPointerDown($any($event))"
173
+ (pointermove)="onPointerMove($any($event))"
174
+ (pointerup)="onPointerUp($any($event))"
175
+ (pointerout)="onPointerOut($any($event))"
176
+ >
177
+ @if (pivotControls.annotations()) {
178
+ <ngts-html [options]="{ position: [r(), r(), 0] }">
179
+ <div
180
+ #annotation
181
+ ngtsHTMLContent
182
+ style="display: none; background: #151520; color: white; padding: 6px 8px; border-radius: 7px; white-space: nowrap"
183
+ [class]="pivotControls.annotationsClass()"
184
+ ></div>
185
+ </ngts-html>
186
+ }
187
+
188
+ <ngts-line
189
+ [points]="arc()"
190
+ [options]="{ lineWidth: pivotControls.lineWidth() * 4, visible: false, userData: pivotControls.userData() }"
191
+ />
192
+
193
+ <ngts-line
194
+ [points]="arc()"
195
+ [options]="{
196
+ transparent: true,
197
+ raycast: null,
198
+ depthTest: pivotControls.depthTest(),
199
+ lineWidth: pivotControls.lineWidth(),
200
+ side: DoubleSide,
201
+ color: hovered() ? pivotControls.hoveredColor() : pivotControls.axisColors()[axis()],
202
+ opacity: pivotControls.opacity(),
203
+ polygonOffset: true,
204
+ polygonOffsetFactor: -10,
205
+ fog: false,
206
+ }"
207
+ />
208
+ </ngt-group>
209
+ `, isInline: true, dependencies: [{ kind: "component", type: NgtsLine, selector: "ngts-line", inputs: ["points", "options"] }, { kind: "component", type: NgtsHTML, selector: "ngts-html", inputs: ["options"] }, { kind: "component", type: NgtsHTMLContent, selector: "[ngtsHTMLContent]", inputs: ["ngtsHTMLContent"], outputs: ["occluded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
210
+ }
211
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsAxisRotator, decorators: [{
212
+ type: Component,
213
+ args: [{
214
+ selector: 'ngts-axis-rotator',
215
+ standalone: true,
216
+ template: `
217
+ <ngt-group
218
+ #group
219
+ [matrix]="matrixL()"
220
+ [matrixAutoUpdate]="false"
221
+ (pointerdown)="onPointerDown($any($event))"
222
+ (pointermove)="onPointerMove($any($event))"
223
+ (pointerup)="onPointerUp($any($event))"
224
+ (pointerout)="onPointerOut($any($event))"
225
+ >
226
+ @if (pivotControls.annotations()) {
227
+ <ngts-html [options]="{ position: [r(), r(), 0] }">
228
+ <div
229
+ #annotation
230
+ ngtsHTMLContent
231
+ style="display: none; background: #151520; color: white; padding: 6px 8px; border-radius: 7px; white-space: nowrap"
232
+ [class]="pivotControls.annotationsClass()"
233
+ ></div>
234
+ </ngts-html>
235
+ }
236
+
237
+ <ngts-line
238
+ [points]="arc()"
239
+ [options]="{ lineWidth: pivotControls.lineWidth() * 4, visible: false, userData: pivotControls.userData() }"
240
+ />
241
+
242
+ <ngts-line
243
+ [points]="arc()"
244
+ [options]="{
245
+ transparent: true,
246
+ raycast: null,
247
+ depthTest: pivotControls.depthTest(),
248
+ lineWidth: pivotControls.lineWidth(),
249
+ side: DoubleSide,
250
+ color: hovered() ? pivotControls.hoveredColor() : pivotControls.axisColors()[axis()],
251
+ opacity: pivotControls.opacity(),
252
+ polygonOffset: true,
253
+ polygonOffsetFactor: -10,
254
+ fog: false,
255
+ }"
256
+ />
257
+ </ngt-group>
258
+ `,
259
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
260
+ changeDetection: ChangeDetectionStrategy.OnPush,
261
+ imports: [NgtsLine, NgtsHTML, NgtsHTMLContent],
262
+ }]
263
+ }], ctorParameters: () => [] });
264
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXhpcy1yb3RhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL2dpem1vcy9zcmMvbGliL3Bpdm90LWNvbnRyb2xzL2F4aXMtcm90YXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1Isc0JBQXNCLEVBQ3RCLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUN4RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7QUFFckQsTUFBTSxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUMvQixNQUFNLGVBQWUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBRXRDLFNBQVMsU0FBUyxDQUFDLE9BQWU7SUFDakMsT0FBTyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ2xDLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxPQUFlO0lBQ2pDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsVUFBbUIsRUFBRSxpQkFBMEIsRUFBRSxN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LGVBQWU7a0JBbEQzQixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQTBDVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDakMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDO2lCQUM5QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuXHRDb21wb25lbnQsXG5cdGNvbXB1dGVkLFxuXHRDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxuXHRFbGVtZW50UmVmLFxuXHRpbmplY3QsXG5cdGlucHV0LFxuXHRTaWduYWwsXG5cdHNpZ25hbCxcblx0dmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGV4dGVuZCwgaW5qZWN0U3RvcmUsIE5ndFRocmVlRXZlbnQgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IE5ndHNMaW5lIH0gZnJvbSAnYW5ndWxhci10aHJlZS1zb2JhL2Fic3RyYWN0aW9ucyc7XG5pbXBvcnQgeyBOZ3RzSFRNTCwgTmd0c0hUTUxDb250ZW50IH0gZnJvbSAnYW5ndWxhci10aHJlZS1zb2JhL21pc2MnO1xuaW1wb3J0IHsgRG91YmxlU2lkZSwgR3JvdXAsIE1hdHJpeDQsIFBsYW5lLCBSYXksIFZlY3RvcjMgfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBOZ3RzUGl2b3RDb250cm9scyB9IGZyb20gJy4vcGl2b3QtY29udHJvbHMnO1xuXG5jb25zdCBjbGlja0RpciA9IG5ldyBWZWN0b3IzKCk7XG5jb25zdCBpbnRlcnNlY3Rpb25EaXIgPSBuZXcgVmVjdG9yMygpO1xuXG5mdW5jdGlvbiB0b0RlZ3JlZXMocmFkaWFuczogbnVtYmVyKSB7XG5cdHJldHVybiAocmFkaWFucyAqIDE4MCkgLyBNYXRoLlBJO1xufVxuXG5mdW5jdGlvbiB0b1JhZGlhbnMoZGVncmVlczogbnVtYmVyKSB7XG5cdHJldHVybiAoZGVncmVlcyAqIE1hdGguUEkpIC8gMTgwO1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVBbmdsZShjbGlja1BvaW50OiBWZWN0b3IzLCBpbnRlcnNlY3Rpb25Qb2ludDogVmVjdG9yMywgb3JpZ2luOiBWZWN0b3IzLCBlMTogVmVjdG9yMywgZTI6IFZlY3RvcjMpIHtcblx0Y2xpY2tEaXIuY29weShjbGlja1BvaW50KS5zdWIob3JpZ2luKTtcblx0aW50ZXJzZWN0aW9uRGlyLmNvcHkoaW50ZXJzZWN0aW9uUG9pbnQpLnN1YihvcmlnaW4pO1xuXHRjb25zdCBkb3RlMWUxID0gZTEuZG90KGUxKTtcblx0Y29uc3QgZG90ZTJlMiA9IGUyLmRvdChlMik7XG5cdGNvbnN0IHVDbGljayA9IGNsaWNrRGlyLmRvdChlMSkgLyBkb3RlMWUxO1xuXHRjb25zdCB2Q2xpY2sgPSBjbGlja0Rpci5kb3QoZTIpIC8gZG90ZTJlMjtcblx0Y29uc3QgdUludGVyc2VjdGlvbiA9IGludGVyc2VjdGlvbkRpci5kb3QoZTEpIC8gZG90ZTFlMTtcblx0Y29uc3QgdkludGVyc2VjdGlvbiA9IGludGVyc2VjdGlvbkRpci5kb3QoZTIpIC8gZG90ZTJlMjtcblx0Y29uc3QgYW5nbGVDbGljayA9IE1hdGguYXRhbjIodkNsaWNrLCB1Q2xpY2spO1xuXHRjb25zdCBhbmdsZUludGVyc2VjdGlvbiA9IE1hdGguYXRhbjIodkludGVyc2VjdGlvbiwgdUludGVyc2VjdGlvbik7XG5cdHJldHVybiBhbmdsZUludGVyc2VjdGlvbiAtIGFuZ2xlQ2xpY2s7XG59XG5cbmZ1bmN0aW9uIGZtb2QobnVtOiBudW1iZXIsIGRlbm9tOiBudW1iZXIpIHtcblx0bGV0IGsgPSBNYXRoLmZsb29yKG51bSAvIGRlbm9tKTtcblx0ayA9IGsgPCAwID8gayArIDEgOiBrO1xuXG5cdHJldHVybiBudW0gLSBrICogZGVub207XG59XG5cbmZ1bmN0aW9uIG1pbmltaXplQW5nbGUoYW5nbGU6IG51bWJlcikge1xuXHRsZXQgcmVzdWx0ID0gZm1vZChhbmdsZSwgMiAqIE1hdGguUEkpO1xuXG5cdGlmIChNYXRoLmFicyhyZXN1bHQpIDwgMWUtNikge1xuXHRcdHJldHVybiAwLjA7XG5cdH1cblxuXHRpZiAocmVzdWx0IDwgMC4wKSB7XG5cdFx0cmVzdWx0ICs9IDIgKiBNYXRoLlBJO1xuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3Qgcm90TWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcbmNvbnN0IHBvc05ldyA9IG5ldyBWZWN0b3IzKCk7XG5jb25zdCByYXkgPSBuZXcgUmF5KCk7XG5jb25zdCBpbnRlcnNlY3Rpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3RzLWF4aXMtcm90YXRvcicsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1ncm91cFxuXHRcdFx0I2dyb3VwXG5cdFx0XHRbbWF0cml4XT1cIm1hdHJpeEwoKVwiXG5cdFx0XHRbbWF0cml4QXV0b1VwZGF0ZV09XCJmYWxzZVwiXG5cdFx0XHQocG9pbnRlcmRvd24pPVwib25Qb2ludGVyRG93bigkYW55KCRldmVudCkpXCJcblx0XHRcdChwb2ludGVybW92ZSk9XCJvblBvaW50ZXJNb3ZlKCRhbnkoJGV2ZW50KSlcIlxuXHRcdFx0KHBvaW50ZXJ1cCk9XCJvblBvaW50ZXJVcCgkYW55KCRldmVudCkpXCJcblx0XHRcdChwb2ludGVyb3V0KT1cIm9uUG9pbnRlck91dCgkYW55KCRldmVudCkpXCJcblx0XHQ+XG5cdFx0XHRAaWYgKHBpdm90Q29udHJvbHMuYW5ub3RhdGlvbnMoKSkge1xuXHRcdFx0XHQ8bmd0cy1odG1sIFtvcHRpb25zXT1cInsgcG9zaXRpb246IFtyKCksIHIoKSwgMF0gfVwiPlxuXHRcdFx0XHRcdDxkaXZcblx0XHRcdFx0XHRcdCNhbm5vdGF0aW9uXG5cdFx0XHRcdFx0XHRuZ3RzSFRNTENvbnRlbnRcblx0XHRcdFx0XHRcdHN0eWxlPVwiZGlzcGxheTogbm9uZTsgYmFja2dyb3VuZDogIzE1MTUyMDsgY29sb3I6IHdoaXRlOyBwYWRkaW5nOiA2cHggOHB4OyBib3JkZXItcmFkaXVzOiA3cHg7IHdoaXRlLXNwYWNlOiBub3dyYXBcIlxuXHRcdFx0XHRcdFx0W2NsYXNzXT1cInBpdm90Q29udHJvbHMuYW5ub3RhdGlvbnNDbGFzcygpXCJcblx0XHRcdFx0XHQ+PC9kaXY+XG5cdFx0XHRcdDwvbmd0cy1odG1sPlxuXHRcdFx0fVxuXG5cdFx0XHQ8bmd0cy1saW5lXG5cdFx0XHRcdFtwb2ludHNdPVwiYXJjKClcIlxuXHRcdFx0XHRbb3B0aW9uc109XCJ7IGxpbmVXaWR0aDogcGl2b3RDb250cm9scy5saW5lV2lkdGgoKSAqIDQsIHZpc2libGU6IGZhbHNlLCB1c2VyRGF0YTogcGl2b3RDb250cm9scy51c2VyRGF0YSgpIH1cIlxuXHRcdFx0Lz5cblxuXHRcdFx0PG5ndHMtbGluZVxuXHRcdFx0XHRbcG9pbnRzXT1cImFyYygpXCJcblx0XHRcdFx0W29wdGlvbnNdPVwie1xuXHRcdFx0XHRcdHRyYW5zcGFyZW50OiB0cnVlLFxuXHRcdFx0XHRcdHJheWNhc3Q6IG51bGwsXG5cdFx0XHRcdFx0ZGVwdGhUZXN0OiBwaXZvdENvbnRyb2xzLmRlcHRoVGVzdCgpLFxuXHRcdFx0XHRcdGxpbmVXaWR0aDogcGl2b3RDb250cm9scy5saW5lV2lkdGgoKSxcblx0XHRcdFx0XHRzaWRlOiBEb3VibGVTaWRlLFxuXHRcdFx0XHRcdGNvbG9yOiBob3ZlcmVkKCkgPyBwaXZvdENvbnRyb2xzLmhvdmVyZWRDb2xvcigpIDogcGl2b3RDb250cm9scy5heGlzQ29sb3JzKClbYXhpcygpXSxcblx0XHRcdFx0XHRvcGFjaXR5OiBwaXZvdENvbnRyb2xzLm9wYWNpdHkoKSxcblx0XHRcdFx0XHRwb2x5Z29uT2Zmc2V0OiB0cnVlLFxuXHRcdFx0XHRcdHBvbHlnb25PZmZzZXRGYWN0b3I6IC0xMCxcblx0XHRcdFx0XHRmb2c6IGZhbHNlLFxuXHRcdFx0XHR9XCJcblx0XHRcdC8+XG5cdFx0PC9uZ3QtZ3JvdXA+XG5cdGAsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG5cdGltcG9ydHM6IFtOZ3RzTGluZSwgTmd0c0hUTUwsIE5ndHNIVE1MQ29udGVudF0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNBeGlzUm90YXRvciB7XG5cdHByb3RlY3RlZCByZWFkb25seSBEb3VibGVTaWRlID0gRG91YmxlU2lkZTtcblxuXHRkaXIxID0gaW5wdXQucmVxdWlyZWQ8VmVjdG9yMz4oKTtcblx0ZGlyMiA9IGlucHV0LnJlcXVpcmVkPFZlY3RvcjM+KCk7XG5cdGF4aXMgPSBpbnB1dC5yZXF1aXJlZDwwIHwgMSB8IDI+KCk7XG5cblx0Z3JvdXBSZWYgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxHcm91cD4+KCdncm91cCcpO1xuXHRhbm5vdGF0aW9uUmVmID0gdmlld0NoaWxkPHVua25vd24sIEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignYW5ub3RhdGlvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcblxuXHRwaXZvdENvbnRyb2xzID0gaW5qZWN0KE5ndHNQaXZvdENvbnRyb2xzKTtcblx0cHJpdmF0ZSBzdG9yZSA9IGluamVjdFN0b3JlKCk7XG5cdHByaXZhdGUgY29udHJvbHMgPSB0aGlzLnN0b3JlLnNlbGVjdCgnY29udHJvbHMnKSBhcyB1bmtub3duIGFzIFNpZ25hbDx7IGVuYWJsZWQ6IGJvb2xlYW4gfT47XG5cblx0aG92ZXJlZCA9IHNpZ25hbChmYWxzZSk7XG5cdHByaXZhdGUgYW5nbGUgPSAwO1xuXHRwcml2YXRlIGFuZ2xlMCA9IDA7XG5cdHByaXZhdGUgY2xpY2tJbmZvOiB7XG5cdFx0Y2xpY2tQb2ludDogVmVjdG9yMztcblx0XHRvcmlnaW46IFZlY3RvcjM7XG5cdFx0ZTE6IFZlY3RvcjM7XG5cdFx0ZTI6IFZlY3RvcjM7XG5cdFx0bm9ybWFsOiBWZWN0b3IzO1xuXHRcdHBsYW5lOiBQbGFuZTtcblx0fSB8IG51bGwgPSBudWxsO1xuXG5cdG1hdHJpeEwgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgZGlyMU4gPSB0aGlzLmRpcjEoKS5jbG9uZSgpLm5vcm1hbGl6ZSgpO1xuXHRcdGNvbnN0IGRpcjJOID0gdGhpcy5kaXIyKCkuY2xvbmUoKS5ub3JtYWxpemUoKTtcblx0XHRyZXR1cm4gbmV3IE1hdHJpeDQoKS5tYWtlQmFzaXMoZGlyMU4sIGRpcjJOLCBkaXIxTi5jbG9uZSgpLmNyb3NzKGRpcjJOKSk7XG5cdH0pO1xuXHRyID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMucGl2b3RDb250cm9scy5maXhlZCgpID8gMC42NSA6IHRoaXMucGl2b3RDb250cm9scy5zY2FsZSgpICogMC42NSkpO1xuXHRhcmMgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3Qgc2VnbWVudHMgPSAzMjtcblx0XHRjb25zdCBwb2ludHM6IFZlY3RvcjNbXSA9IFtdO1xuXHRcdGZvciAobGV0IGogPSAwOyBqIDw9IHNlZ21lbnRzOyBqKyspIHtcblx0XHRcdGNvbnN0IGFuZ2xlID0gKGogKiAoTWF0aC5QSSAvIDIpKSAvIHNlZ21lbnRzO1xuXHRcdFx0cG9pbnRzLnB1c2gobmV3IFZlY3RvcjMoTWF0aC5jb3MoYW5nbGUpICogdGhpcy5yKCksIE1hdGguc2luKGFuZ2xlKSAqIHRoaXMucigpLCAwKSk7XG5cdFx0fVxuXHRcdHJldHVybiBwb2ludHM7XG5cdH0pO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGV4dGVuZCh7IEdyb3VwIH0pO1xuXHR9XG5cblx0b25Qb2ludGVyRG93bihldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSB7XG5cdFx0Y29uc3QgW2Fubm90YXRpb24sIGdyb3VwLCBheGlzLCBjb250cm9sc10gPSBbXG5cdFx0XHR0aGlzLmFubm90YXRpb25SZWYoKT8ubmF0aXZlRWxlbWVudCxcblx0XHRcdHRoaXMuZ3JvdXBSZWYoKS5uYXRpdmVFbGVtZW50LFxuXHRcdFx0dGhpcy5heGlzKCksXG5cdFx0XHR0aGlzLmNvbnRyb2xzKCksXG5cdFx0XTtcblxuXHRcdGlmIChhbm5vdGF0aW9uKSB7XG5cdFx0XHRhbm5vdGF0aW9uLmlubmVyVGV4dCA9IGAke3RvRGVncmVlcyh0aGlzLmFuZ2xlKS50b0ZpeGVkKDApfcK6YDtcblx0XHRcdGFubm90YXRpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cdFx0fVxuXG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0Y29uc3QgY2xpY2tQb2ludCA9IGV2ZW50LnBvaW50LmNsb25lKCk7XG5cdFx0Y29uc3Qgb3JpZ2luID0gbmV3IFZlY3RvcjMoKS5zZXRGcm9tTWF0cml4UG9zaXRpb24oZ3JvdXAubWF0cml4V29ybGQpO1xuXHRcdGNvbnN0IGUxID0gbmV3IFZlY3RvcjMoKS5zZXRGcm9tTWF0cml4Q29sdW1uKGdyb3VwLm1hdHJpeFdvcmxkLCAwKS5ub3JtYWxpemUoKTtcblx0XHRjb25zdCBlMiA9IG5ldyBWZWN0b3IzKCkuc2V0RnJvbU1hdHJpeENvbHVtbihncm91cC5tYXRyaXhXb3JsZCwgMSkubm9ybWFsaXplKCk7XG5cdFx0Y29uc3Qgbm9ybWFsID0gbmV3IFZlY3RvcjMoKS5zZXRGcm9tTWF0cml4Q29sdW1uKGdyb3VwLm1hdHJpeFdvcmxkLCAyKS5ub3JtYWxpemUoKTtcblx0XHRjb25zdCBwbGFuZSA9IG5ldyBQbGFuZSgpLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KG5vcm1hbCwgb3JpZ2luKTtcblx0XHR0aGlzLmNsaWNrSW5mbyA9IHsgY2xpY2tQb2ludCwgb3JpZ2luLCBlMSwgZTIsIG5vcm1hbCwgcGxhbmUgfTtcblx0XHR0aGlzLnBpdm90Q29udHJvbHMub25EcmFnU3RhcnQoeyBjb21wb25lbnQ6ICdSb3RhdG9yJywgYXhpcywgb3JpZ2luLCBkaXJlY3Rpb25zOiBbZTEsIGUyLCBub3JtYWxdIH0pO1xuXG5cdFx0aWYgKGNvbnRyb2xzKSB7XG5cdFx0XHRjb250cm9scy5lbmFibGVkID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciAtIHNldFBvaW50ZXJDYXB0dXJlIGlzIG5vdCBhIGZ1bmN0aW9uIG9uIFBvaW50ZXJFdmVudFxuXHRcdGV2ZW50LnRhcmdldC5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuXHR9XG5cblx0b25Qb2ludGVyTW92ZShldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSB7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0aWYgKCF0aGlzLmhvdmVyZWQoKSkgdGhpcy5ob3ZlcmVkLnNldCh0cnVlKTtcblx0XHRpZiAodGhpcy5jbGlja0luZm8pIHtcblx0XHRcdGNvbnN0IHsgY2xpY2tQb2ludCwgb3JpZ2luLCBlMSwgZTIsIG5vcm1hbCwgcGxhbmUgfSA9IHRoaXMuY2xpY2tJbmZvO1xuXHRcdFx0Y29uc3QgW3JvdGF0aW9uTGltaXRzLCBheGlzLCBhbm5vdGF0aW9uXSA9IFtcblx0XHRcdFx0dGhpcy5waXZvdENvbnRyb2xzLnJvdGF0aW9uTGltaXRzKCksXG5cdFx0XHRcdHRoaXMuYXhpcygpLFxuXHRcdFx0XHR0aGlzLmFubm90YXRpb25SZWYoKT8ubmF0aXZlRWxlbWVudCxcblx0XHRcdF07XG5cblx0XHRcdGNvbnN0IFttaW4sIG1heF0gPSByb3RhdGlvbkxpbWl0cz8uW2F4aXNdIHx8IFt1bmRlZmluZWQsIHVuZGVmaW5lZF07XG5cblx0XHRcdHJheS5jb3B5KGV2ZW50LnJheSk7XG5cdFx0XHRyYXkuaW50ZXJzZWN0UGxhbmUocGxhbmUsIGludGVyc2VjdGlvbik7XG5cdFx0XHRyYXkuZGlyZWN0aW9uLm5lZ2F0ZSgpO1xuXHRcdFx0cmF5LmludGVyc2VjdFBsYW5lKHBsYW5lLCBpbnRlcnNlY3Rpb24pO1xuXHRcdFx0bGV0IGRlbHRhQW5nbGUgPSBjYWxjdWxhdGVBbmdsZShjbGlja1BvaW50LCBpbnRlcnNlY3Rpb24sIG9yaWdpbiwgZTEsIGUyKTtcblx0XHRcdGxldCBkZWdyZWVzID0gdG9EZWdyZWVzKGRlbHRhQW5nbGUpO1xuXG5cdFx0XHRpZiAoZXZlbnQuc2hpZnRLZXkpIHtcblx0XHRcdFx0ZGVncmVlcyA9IE1hdGgucm91bmQoZGVncmVlcyAvIDEwKSAqIDEwO1xuXHRcdFx0XHRkZWx0YUFuZ2xlID0gdG9SYWRpYW5zKGRlZ3JlZXMpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobWluICE9PSB1bmRlZmluZWQgJiYgbWF4ICE9PSB1bmRlZmluZWQgJiYgbWF4IC0gbWluIDwgMiAqIE1hdGguUEkpIHtcblx0XHRcdFx0ZGVsdGFBbmdsZSA9IG1pbmltaXplQW5nbGUoZGVsdGFBbmdsZSk7XG5cdFx0XHRcdGRlbHRhQW5nbGUgPSBkZWx0YUFuZ2xlID4gTWF0aC5QSSA/IGRlbHRhQW5nbGUgLSAyICogTWF0aC5QSSA6IGRlbHRhQW5nbGU7XG5cdFx0XHRcdGRlbHRhQW5nbGUgPSBNYXRoLnJvdW5kKGRlbHRhQW5nbGUgLyAxMCkgKiAxMDtcblx0XHRcdFx0dGhpcy5hbmdsZSA9IHRoaXMuYW5nbGUwICsgZGVsdGFBbmdsZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuYW5nbGUgPSBtaW5pbWl6ZUFuZ2xlKHRoaXMuYW5nbGUwICsgZGVsdGFBbmdsZSk7XG5cdFx0XHRcdHRoaXMuYW5nbGUgPSB0aGlzLmFuZ2xlID4gTWF0aC5QSSA/IHRoaXMuYW5nbGUgLSAyICogTWF0aC5QSSA6IHRoaXMuYW5nbGU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhbm5vdGF0aW9uKSB7XG5cdFx0XHRcdGRlZ3JlZXMgPSB0b0RlZ3JlZXModGhpcy5hbmdsZSk7XG5cdFx0XHRcdGFubm90YXRpb24uaW5uZXJUZXh0ID0gYCR7ZGVncmVlcy50b0ZpeGVkKDApfcK6YDtcblx0XHRcdH1cblxuXHRcdFx0cm90TWF0cml4Lm1ha2VSb3RhdGlvbkF4aXMobm9ybWFsLCBkZWx0YUFuZ2xlKTtcblx0XHRcdHBvc05ldy5jb3B5KG9yaWdpbikuYXBwbHlNYXRyaXg0KHJvdE1hdHJpeCkuc3ViKG9yaWdpbikubmVnYXRlKCk7XG5cdFx0XHRyb3RNYXRyaXguc2V0UG9zaXRpb24ocG9zTmV3KTtcblx0XHRcdHRoaXMucGl2b3RDb250cm9scy5vbkRyYWcocm90TWF0cml4KTtcblx0XHR9XG5cdH1cblxuXHRvblBvaW50ZXJVcChldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSB7XG5cdFx0Y29uc3QgW2Fubm90YXRpb24sIGNvbnRyb2xzXSA9IFt0aGlzLmFubm90YXRpb25SZWYoKT8ubmF0aXZlRWxlbWVudCwgdGhpcy5jb250cm9scygpXTtcblx0XHRpZiAoYW5ub3RhdGlvbikge1xuXHRcdFx0YW5ub3RhdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdH1cblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR0aGlzLmNsaWNrSW5mbyA9IG51bGw7XG5cdFx0dGhpcy5waXZvdENvbnRyb2xzLm9uRHJhZ0VuZCgpO1xuXHRcdGlmIChjb250cm9scykge1xuXHRcdFx0Y29udHJvbHMuZW5hYmxlZCA9IHRydWU7XG5cdFx0fVxuXHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgLSByZWxlYXNlUG9pbnRlckNhcHR1cmUgaXMgbm90IGEgZnVuY3Rpb24gb24gUG9pbnRlckV2ZW50XG5cdFx0ZXZlbnQudGFyZ2V0LnJlbGVhc2VQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuXHR9XG5cblx0b25Qb2ludGVyT3V0KGV2ZW50OiBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR0aGlzLmhvdmVyZWQuc2V0KGZhbHNlKTtcblx0fVxufVxuIl19