angular-three-soba 2.13.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/abstractions/lib/catmull-rom-line.d.ts +247 -247
- package/abstractions/lib/edges.d.ts +276 -276
- package/abstractions/lib/grid.d.ts +45 -45
- package/abstractions/lib/line.d.ts +1 -1
- package/abstractions/lib/prism-geometry.d.ts +4 -4
- package/abstractions/lib/rounded-box.d.ts +1 -1
- package/abstractions/lib/text-3d.d.ts +51 -51
- package/abstractions/lib/text.d.ts +1 -1
- package/cameras/lib/cube-camera.d.ts +1 -1
- package/cameras/lib/orthographic-camera.d.ts +1 -1
- package/cameras/lib/perspective-camera.d.ts +1 -1
- package/controls/index.d.ts +0 -9
- package/fesm2022/angular-three-soba-abstractions.mjs +41 -52
- package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2022/angular-three-soba-cameras.mjs +12 -15
- package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2022/angular-three-soba-controls.mjs +16 -30
- package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
- package/fesm2022/angular-three-soba-gizmos.mjs +59 -60
- package/fesm2022/angular-three-soba-gizmos.mjs.map +1 -1
- package/fesm2022/angular-three-soba-loaders.mjs +3 -3
- package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-materials.mjs +27 -35
- package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2022/angular-three-soba-misc.mjs +27 -29
- package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2022/angular-three-soba-performances.mjs +31 -34
- package/fesm2022/angular-three-soba-performances.mjs.map +1 -1
- package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-staging.mjs +91 -105
- package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
- package/fesm2022/angular-three-soba-stats.mjs +3 -3
- package/fesm2022/angular-three-soba-stats.mjs.map +1 -1
- package/gizmos/lib/gizmo-helper/gizmo-viewport.d.ts +1 -1
- package/gizmos/lib/pivot-controls/pivot-controls.d.ts +1 -1
- package/materials/lib/mesh-portal-material.d.ts +1 -1
- package/materials/lib/mesh-refraction-material.d.ts +1 -1
- package/misc/lib/computed-attribute.d.ts +3 -3
- package/misc/lib/decal.d.ts +1 -1
- package/misc/lib/html/html.d.ts +2 -2
- package/package.json +8 -34
- package/performances/lib/instances/instances.d.ts +7 -7
- package/performances/lib/points/points.d.ts +16 -16
- package/performances/lib/segments/segments.d.ts +1 -1
- package/staging/lib/accumulative-shadows.d.ts +1 -1
- package/staging/lib/caustics.d.ts +1 -1
- package/staging/lib/center.d.ts +2 -2
- package/staging/lib/contact-shadows.d.ts +1 -1
- package/staging/lib/lightformer.d.ts +1 -1
- package/staging/lib/mask.d.ts +1 -1
- package/staging/lib/sky.d.ts +1 -1
- package/staging/lib/spot-light.d.ts +1 -1
- package/staging/lib/stage.d.ts +5 -5
- package/esm2022/abstractions/angular-three-soba-abstractions.mjs +0 -5
- package/esm2022/abstractions/index.mjs +0 -14
- package/esm2022/abstractions/lib/billboard.mjs +0 -69
- package/esm2022/abstractions/lib/catmull-rom-line.mjs +0 -76
- package/esm2022/abstractions/lib/cubic-bezier-line.mjs +0 -51
- package/esm2022/abstractions/lib/edges.mjs +0 -66
- package/esm2022/abstractions/lib/gradient-texture.mjs +0 -91
- package/esm2022/abstractions/lib/grid.mjs +0 -103
- package/esm2022/abstractions/lib/helper.mjs +0 -74
- package/esm2022/abstractions/lib/line.mjs +0 -123
- package/esm2022/abstractions/lib/prism-geometry.mjs +0 -46
- package/esm2022/abstractions/lib/quadratic-bezier-line.mjs +0 -73
- package/esm2022/abstractions/lib/rounded-box.mjs +0 -131
- package/esm2022/abstractions/lib/text-3d.mjs +0 -100
- package/esm2022/abstractions/lib/text.mjs +0 -86
- package/esm2022/angular-three-soba.mjs +0 -5
- package/esm2022/cameras/angular-three-soba-cameras.mjs +0 -5
- package/esm2022/cameras/index.mjs +0 -5
- package/esm2022/cameras/lib/camera-content.mjs +0 -14
- package/esm2022/cameras/lib/cube-camera.mjs +0 -102
- package/esm2022/cameras/lib/orthographic-camera.mjs +0 -131
- package/esm2022/cameras/lib/perspective-camera.mjs +0 -105
- package/esm2022/controls/angular-three-soba-controls.mjs +0 -5
- package/esm2022/controls/index.mjs +0 -9
- package/esm2022/controls/lib/camera-controls.mjs +0 -126
- package/esm2022/controls/lib/orbit-controls.mjs +0 -120
- package/esm2022/controls/lib/scroll-controls.mjs +0 -261
- package/esm2022/gizmos/angular-three-soba-gizmos.mjs +0 -5
- package/esm2022/gizmos/index.mjs +0 -6
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-helper.mjs +0 -191
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewcube.mjs +0 -304
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewport.mjs +0 -348
- package/esm2022/gizmos/lib/pivot-controls/axis-arrow.mjs +0 -265
- package/esm2022/gizmos/lib/pivot-controls/axis-rotator.mjs +0 -264
- package/esm2022/gizmos/lib/pivot-controls/pivot-controls.mjs +0 -349
- package/esm2022/gizmos/lib/pivot-controls/plane-slider.mjs +0 -266
- package/esm2022/gizmos/lib/pivot-controls/scaling-sphere.mjs +0 -232
- package/esm2022/gizmos/lib/transform-controls.mjs +0 -177
- package/esm2022/index.mjs +0 -2
- package/esm2022/loaders/angular-three-soba-loaders.mjs +0 -5
- package/esm2022/loaders/index.mjs +0 -7
- package/esm2022/loaders/lib/fbx-loader.mjs +0 -13
- package/esm2022/loaders/lib/font-loader.mjs +0 -49
- package/esm2022/loaders/lib/gltf-loader.mjs +0 -51
- package/esm2022/loaders/lib/loader.mjs +0 -103
- package/esm2022/loaders/lib/progress.mjs +0 -51
- package/esm2022/loaders/lib/texture-loader.mjs +0 -32
- package/esm2022/materials/angular-three-soba-materials.mjs +0 -5
- package/esm2022/materials/index.mjs +0 -9
- package/esm2022/materials/lib/custom-shader-material.mjs +0 -67
- package/esm2022/materials/lib/mesh-distort-material.mjs +0 -43
- package/esm2022/materials/lib/mesh-portal-material.mjs +0 -294
- package/esm2022/materials/lib/mesh-reflector-material.mjs +0 -274
- package/esm2022/materials/lib/mesh-refraction-material.mjs +0 -140
- package/esm2022/materials/lib/mesh-transmission-material.mjs +0 -188
- package/esm2022/materials/lib/mesh-wobble-material.mjs +0 -43
- package/esm2022/materials/lib/point-material.mjs +0 -34
- package/esm2022/misc/angular-three-soba-misc.mjs +0 -5
- package/esm2022/misc/index.mjs +0 -15
- package/esm2022/misc/lib/animations.mjs +0 -71
- package/esm2022/misc/lib/bake-shadows.mjs +0 -24
- package/esm2022/misc/lib/computed-attribute.mjs +0 -51
- package/esm2022/misc/lib/constants.mjs +0 -5
- package/esm2022/misc/lib/decal.mjs +0 -142
- package/esm2022/misc/lib/deprecated.mjs +0 -15
- package/esm2022/misc/lib/depth-buffer.mjs +0 -35
- package/esm2022/misc/lib/fbo.mjs +0 -86
- package/esm2022/misc/lib/html/html-content.mjs +0 -322
- package/esm2022/misc/lib/html/html.mjs +0 -129
- package/esm2022/misc/lib/html/utils.mjs +0 -74
- package/esm2022/misc/lib/intersect.mjs +0 -49
- package/esm2022/misc/lib/preload.mjs +0 -58
- package/esm2022/misc/lib/sampler.mjs +0 -122
- package/esm2022/misc/lib/scale-factor.mjs +0 -29
- package/esm2022/performances/angular-three-soba-performances.mjs +0 -5
- package/esm2022/performances/index.mjs +0 -7
- package/esm2022/performances/lib/adaptive-dpr.mjs +0 -46
- package/esm2022/performances/lib/adaptive-events.mjs +0 -24
- package/esm2022/performances/lib/detailed.mjs +0 -53
- package/esm2022/performances/lib/instances/instances.mjs +0 -177
- package/esm2022/performances/lib/instances/position-mesh.mjs +0 -51
- package/esm2022/performances/lib/points/points.mjs +0 -272
- package/esm2022/performances/lib/points/position-point.mjs +0 -53
- package/esm2022/performances/lib/segments/segment-object.mjs +0 -9
- package/esm2022/performances/lib/segments/segments.mjs +0 -126
- package/esm2022/shaders/angular-three-soba-shaders.mjs +0 -5
- package/esm2022/shaders/index.mjs +0 -4
- package/esm2022/shaders/lib/grid-material.mjs +0 -81
- package/esm2022/shaders/lib/mesh-refraction-material.mjs +0 -163
- package/esm2022/shaders/lib/point-material.mjs +0 -24
- package/esm2022/staging/angular-three-soba-staging.mjs +0 -5
- package/esm2022/staging/index.mjs +0 -21
- package/esm2022/staging/lib/accumulative-shadows.mjs +0 -180
- package/esm2022/staging/lib/backdrop.mjs +0 -69
- package/esm2022/staging/lib/bb-anchor.mjs +0 -58
- package/esm2022/staging/lib/bounds.mjs +0 -282
- package/esm2022/staging/lib/camera-shake.mjs +0 -65
- package/esm2022/staging/lib/caustics.mjs +0 -184
- package/esm2022/staging/lib/center.mjs +0 -114
- package/esm2022/staging/lib/contact-shadows.mjs +0 -214
- package/esm2022/staging/lib/environment/environment.mjs +0 -344
- package/esm2022/staging/lib/environment/inject-environment.mjs +0 -184
- package/esm2022/staging/lib/float.mjs +0 -70
- package/esm2022/staging/lib/lightformer.mjs +0 -103
- package/esm2022/staging/lib/mask.mjs +0 -74
- package/esm2022/staging/lib/matcap-texture.mjs +0 -79
- package/esm2022/staging/lib/normal-texture.mjs +0 -79
- package/esm2022/staging/lib/randomized-lights.mjs +0 -100
- package/esm2022/staging/lib/render-texture.mjs +0 -202
- package/esm2022/staging/lib/sky.mjs +0 -86
- package/esm2022/staging/lib/spot-light.mjs +0 -445
- package/esm2022/staging/lib/stage.mjs +0 -232
- package/esm2022/stats/angular-three-soba-stats.mjs +0 -5
- package/esm2022/stats/index.mjs +0 -2
- package/esm2022/stats/lib/stats.mjs +0 -57
- package/esm2022/vanilla-exports/angular-three-soba-vanilla-exports.mjs +0 -5
- package/esm2022/vanilla-exports/index.mjs +0 -3
|
@@ -1,282 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA, effect, input, untracked, viewChild, } from '@angular/core';
|
|
2
|
-
import { extend, injectBeforeRender, injectStore, is, pick } from 'angular-three';
|
|
3
|
-
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
4
|
-
import { Box3, Group, Matrix4, Quaternion, Vector3 } from 'three';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
var AnimationState;
|
|
7
|
-
(function (AnimationState) {
|
|
8
|
-
AnimationState[AnimationState["NONE"] = 0] = "NONE";
|
|
9
|
-
AnimationState[AnimationState["START"] = 1] = "START";
|
|
10
|
-
AnimationState[AnimationState["ACTIVE"] = 2] = "ACTIVE";
|
|
11
|
-
})(AnimationState || (AnimationState = {}));
|
|
12
|
-
function isBox3(def) {
|
|
13
|
-
return !!def && def.isBox3;
|
|
14
|
-
}
|
|
15
|
-
function interpolateFuncDefault(t) {
|
|
16
|
-
// Imitates the previously used THREE.MathUtils.damp
|
|
17
|
-
return 1 - Math.exp(-5 * t) + 0.007 * t;
|
|
18
|
-
}
|
|
19
|
-
const defaultOptions = {
|
|
20
|
-
maxDuration: 1.0,
|
|
21
|
-
margin: 1.2,
|
|
22
|
-
interpolateFunc: interpolateFuncDefault,
|
|
23
|
-
clip: false,
|
|
24
|
-
fit: false,
|
|
25
|
-
observe: false,
|
|
26
|
-
};
|
|
27
|
-
export class NgtsBounds {
|
|
28
|
-
constructor() {
|
|
29
|
-
this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
|
|
30
|
-
this.groupRef = viewChild.required('group');
|
|
31
|
-
this.store = injectStore();
|
|
32
|
-
this.camera = this.store.select('camera');
|
|
33
|
-
this.invalidate = this.store.select('invalidate');
|
|
34
|
-
this.size = this.store.select('size');
|
|
35
|
-
this.controls = this.store.select('controls');
|
|
36
|
-
this.clipOption = pick(this.options, 'clip');
|
|
37
|
-
this.fitOption = pick(this.options, 'fit');
|
|
38
|
-
this.observe = pick(this.options, 'observe');
|
|
39
|
-
this.origin = {
|
|
40
|
-
camPos: new Vector3(),
|
|
41
|
-
camRot: new Quaternion(),
|
|
42
|
-
camZoom: 1,
|
|
43
|
-
};
|
|
44
|
-
this.goal = {
|
|
45
|
-
camPos: undefined,
|
|
46
|
-
camRot: undefined,
|
|
47
|
-
camZoom: undefined,
|
|
48
|
-
camUp: undefined,
|
|
49
|
-
target: undefined,
|
|
50
|
-
};
|
|
51
|
-
this.animationState = AnimationState.NONE;
|
|
52
|
-
// represent animation state from 0 to 1
|
|
53
|
-
this.t = 0;
|
|
54
|
-
this.box = new Box3();
|
|
55
|
-
extend({ Group });
|
|
56
|
-
effect((onCleanup) => {
|
|
57
|
-
const [controls, camera] = [this.controls(), untracked(this.camera)];
|
|
58
|
-
if (!controls)
|
|
59
|
-
return;
|
|
60
|
-
const callback = () => {
|
|
61
|
-
if (controls && this.goal.target && this.animationState !== AnimationState.NONE) {
|
|
62
|
-
const front = new Vector3().setFromMatrixColumn(camera.matrix, 2);
|
|
63
|
-
const d0 = this.origin.camPos.distanceTo(controls.target);
|
|
64
|
-
const d1 = (this.goal.camPos || this.origin.camPos).distanceTo(this.goal.target);
|
|
65
|
-
const d = (1 - this.t) * d0 + this.t * d1;
|
|
66
|
-
controls.target.copy(camera.position).addScaledVector(front, -d);
|
|
67
|
-
controls.update();
|
|
68
|
-
}
|
|
69
|
-
this.animationState = AnimationState.NONE;
|
|
70
|
-
};
|
|
71
|
-
controls.addEventListener('start', callback);
|
|
72
|
-
onCleanup(() => controls.removeEventListener('start', callback));
|
|
73
|
-
});
|
|
74
|
-
let count = 0;
|
|
75
|
-
effect(() => {
|
|
76
|
-
const [clip, fit, observe] = [
|
|
77
|
-
this.clipOption(),
|
|
78
|
-
this.fitOption(),
|
|
79
|
-
this.observe(),
|
|
80
|
-
this.size(),
|
|
81
|
-
this.camera(),
|
|
82
|
-
this.controls(),
|
|
83
|
-
];
|
|
84
|
-
if (observe || count++ === 0) {
|
|
85
|
-
this.refresh();
|
|
86
|
-
if (fit)
|
|
87
|
-
this.reset().fit();
|
|
88
|
-
if (clip)
|
|
89
|
-
this.clip();
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
injectBeforeRender(({ delta }) => {
|
|
93
|
-
// This [additional animation step START] is needed to guarantee that delta used in animation isn't absurdly high (2-3 seconds) which is actually possible if rendering happens on demand...
|
|
94
|
-
if (this.animationState === AnimationState.START) {
|
|
95
|
-
this.animationState = AnimationState.ACTIVE;
|
|
96
|
-
this.invalidate();
|
|
97
|
-
}
|
|
98
|
-
else if (this.animationState === AnimationState.ACTIVE) {
|
|
99
|
-
const [{ maxDuration, interpolateFunc }, camera, controls, invalidate] = [
|
|
100
|
-
this.options(),
|
|
101
|
-
this.camera(),
|
|
102
|
-
this.controls(),
|
|
103
|
-
this.invalidate(),
|
|
104
|
-
];
|
|
105
|
-
this.t += delta / maxDuration;
|
|
106
|
-
if (this.t >= 1) {
|
|
107
|
-
this.goal.camPos && camera.position.copy(this.goal.camPos);
|
|
108
|
-
this.goal.camRot && camera.quaternion.copy(this.goal.camRot);
|
|
109
|
-
this.goal.camUp && camera.up.copy(this.goal.camUp);
|
|
110
|
-
this.goal.camZoom && is.orthographicCamera(camera) && (camera.zoom = this.goal.camZoom);
|
|
111
|
-
camera.updateMatrixWorld();
|
|
112
|
-
camera.updateProjectionMatrix();
|
|
113
|
-
if (controls && this.goal.target) {
|
|
114
|
-
controls.target.copy(this.goal.target);
|
|
115
|
-
controls.update();
|
|
116
|
-
}
|
|
117
|
-
this.animationState = AnimationState.NONE;
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
const k = interpolateFunc(this.t);
|
|
121
|
-
this.goal.camPos && camera.position.lerpVectors(this.origin.camPos, this.goal.camPos, k);
|
|
122
|
-
this.goal.camRot && camera.quaternion.slerpQuaternions(this.origin.camRot, this.goal.camRot, k);
|
|
123
|
-
this.goal.camUp && camera.up.set(0, 1, 0).applyQuaternion(camera.quaternion);
|
|
124
|
-
this.goal.camZoom &&
|
|
125
|
-
is.orthographicCamera(camera) &&
|
|
126
|
-
(camera.zoom = (1 - k) * this.origin.camZoom + k * this.goal.camZoom);
|
|
127
|
-
camera.updateMatrixWorld();
|
|
128
|
-
camera.updateProjectionMatrix();
|
|
129
|
-
}
|
|
130
|
-
invalidate();
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
getSize() {
|
|
135
|
-
const [camera, { margin }] = [untracked(this.camera), untracked(this.options)];
|
|
136
|
-
const boxSize = this.box.getSize(new Vector3());
|
|
137
|
-
const center = this.box.getCenter(new Vector3());
|
|
138
|
-
const maxSize = Math.max(boxSize.x, boxSize.y, boxSize.z);
|
|
139
|
-
const fitHeightDistance = is.orthographicCamera(camera)
|
|
140
|
-
? maxSize * 4
|
|
141
|
-
: maxSize / (2 * Math.atan((Math.PI * camera.fov) / 360));
|
|
142
|
-
const fitWidthDistance = is.orthographicCamera(camera) ? maxSize * 4 : fitHeightDistance / camera.aspect;
|
|
143
|
-
const distance = margin * Math.max(fitHeightDistance, fitWidthDistance);
|
|
144
|
-
return { box: this.box, size: boxSize, center, distance };
|
|
145
|
-
}
|
|
146
|
-
refresh(object) {
|
|
147
|
-
const [group, camera] = [untracked(this.groupRef).nativeElement, untracked(this.camera)];
|
|
148
|
-
if (isBox3(object))
|
|
149
|
-
this.box.copy(object);
|
|
150
|
-
else {
|
|
151
|
-
const target = object || group;
|
|
152
|
-
if (!target)
|
|
153
|
-
return this;
|
|
154
|
-
target.updateWorldMatrix(true, true);
|
|
155
|
-
this.box.setFromObject(target);
|
|
156
|
-
}
|
|
157
|
-
if (this.box.isEmpty()) {
|
|
158
|
-
const max = camera.position.length() || 10;
|
|
159
|
-
this.box.setFromCenterAndSize(new Vector3(), new Vector3(max, max, max));
|
|
160
|
-
}
|
|
161
|
-
this.origin.camPos.copy(camera.position);
|
|
162
|
-
this.origin.camRot.copy(camera.quaternion);
|
|
163
|
-
is.orthographicCamera(camera) && (this.origin.camZoom = camera.zoom);
|
|
164
|
-
this.goal.camPos = undefined;
|
|
165
|
-
this.goal.camRot = undefined;
|
|
166
|
-
this.goal.camZoom = undefined;
|
|
167
|
-
this.goal.camUp = undefined;
|
|
168
|
-
this.goal.target = undefined;
|
|
169
|
-
return this;
|
|
170
|
-
}
|
|
171
|
-
reset() {
|
|
172
|
-
const [camera] = [untracked(this.camera)];
|
|
173
|
-
const { center, distance } = this.getSize();
|
|
174
|
-
const direction = camera.position.clone().sub(center).normalize();
|
|
175
|
-
this.goal.camPos = center.clone().addScaledVector(direction, distance);
|
|
176
|
-
this.goal.target = center.clone();
|
|
177
|
-
const mCamRot = new Matrix4().lookAt(this.goal.camPos, this.goal.target, camera.up);
|
|
178
|
-
this.goal.camRot = new Quaternion().setFromRotationMatrix(mCamRot);
|
|
179
|
-
this.animationState = AnimationState.START;
|
|
180
|
-
this.t = 0;
|
|
181
|
-
return this;
|
|
182
|
-
}
|
|
183
|
-
moveTo(position) {
|
|
184
|
-
this.goal.camPos = Array.isArray(position) ? new Vector3(...position) : position.clone();
|
|
185
|
-
this.animationState = AnimationState.START;
|
|
186
|
-
this.t = 0;
|
|
187
|
-
return this;
|
|
188
|
-
}
|
|
189
|
-
lookAt({ target, up }) {
|
|
190
|
-
const [camera] = [untracked(this.camera)];
|
|
191
|
-
this.goal.target = Array.isArray(target) ? new Vector3(...target) : target.clone();
|
|
192
|
-
if (up) {
|
|
193
|
-
this.goal.camUp = Array.isArray(up) ? new Vector3(...up) : up.clone();
|
|
194
|
-
}
|
|
195
|
-
else {
|
|
196
|
-
this.goal.camUp = camera.up.clone();
|
|
197
|
-
}
|
|
198
|
-
const mCamRot = new Matrix4().lookAt(this.goal.camPos || camera.position, this.goal.target, this.goal.camUp);
|
|
199
|
-
this.goal.camRot = new Quaternion().setFromRotationMatrix(mCamRot);
|
|
200
|
-
this.animationState = AnimationState.START;
|
|
201
|
-
this.t = 0;
|
|
202
|
-
return this;
|
|
203
|
-
}
|
|
204
|
-
fit() {
|
|
205
|
-
const [camera, controls, { margin }] = [untracked(this.camera), untracked(this.controls), untracked(this.options)];
|
|
206
|
-
if (!is.orthographicCamera(camera)) {
|
|
207
|
-
// For non-orthographic cameras, fit should behave exactly like reset
|
|
208
|
-
return this.reset();
|
|
209
|
-
}
|
|
210
|
-
// For orthographic cameras, fit should only modify the zoom value
|
|
211
|
-
let maxHeight = 0;
|
|
212
|
-
let maxWidth = 0;
|
|
213
|
-
const vertices = [
|
|
214
|
-
new Vector3(this.box.min.x, this.box.min.y, this.box.min.z),
|
|
215
|
-
new Vector3(this.box.min.x, this.box.max.y, this.box.min.z),
|
|
216
|
-
new Vector3(this.box.min.x, this.box.min.y, this.box.max.z),
|
|
217
|
-
new Vector3(this.box.min.x, this.box.max.y, this.box.max.z),
|
|
218
|
-
new Vector3(this.box.max.x, this.box.max.y, this.box.max.z),
|
|
219
|
-
new Vector3(this.box.max.x, this.box.max.y, this.box.min.z),
|
|
220
|
-
new Vector3(this.box.max.x, this.box.min.y, this.box.max.z),
|
|
221
|
-
new Vector3(this.box.max.x, this.box.min.y, this.box.min.z),
|
|
222
|
-
];
|
|
223
|
-
// Transform the center and each corner to camera space
|
|
224
|
-
const pos = this.goal.camPos || camera.position;
|
|
225
|
-
const target = this.goal.target || controls.target;
|
|
226
|
-
const up = this.goal.camUp || camera.up;
|
|
227
|
-
const mCamWInv = target
|
|
228
|
-
? new Matrix4().lookAt(pos, target, up).setPosition(pos).invert()
|
|
229
|
-
: camera.matrixWorldInverse;
|
|
230
|
-
for (const v of vertices) {
|
|
231
|
-
v.applyMatrix4(mCamWInv);
|
|
232
|
-
maxHeight = Math.max(maxHeight, Math.abs(v.y));
|
|
233
|
-
maxWidth = Math.max(maxWidth, Math.abs(v.x));
|
|
234
|
-
}
|
|
235
|
-
maxHeight *= 2;
|
|
236
|
-
maxWidth *= 2;
|
|
237
|
-
const zoomForHeight = (camera.top - camera.bottom) / maxHeight;
|
|
238
|
-
const zoomForWidth = (camera.right - camera.left) / maxWidth;
|
|
239
|
-
this.goal.camZoom = Math.min(zoomForHeight, zoomForWidth) / margin;
|
|
240
|
-
this.animationState = AnimationState.START;
|
|
241
|
-
this.t = 0;
|
|
242
|
-
return this;
|
|
243
|
-
}
|
|
244
|
-
clip() {
|
|
245
|
-
const [camera, controls, invalidate] = [
|
|
246
|
-
untracked(this.camera),
|
|
247
|
-
untracked(this.controls),
|
|
248
|
-
untracked(this.invalidate),
|
|
249
|
-
];
|
|
250
|
-
const { distance } = this.getSize();
|
|
251
|
-
camera.near = distance / 100;
|
|
252
|
-
camera.far = distance * 100;
|
|
253
|
-
camera.updateProjectionMatrix();
|
|
254
|
-
if (controls) {
|
|
255
|
-
controls.maxDistance = distance * 10;
|
|
256
|
-
controls.update();
|
|
257
|
-
}
|
|
258
|
-
invalidate();
|
|
259
|
-
return this;
|
|
260
|
-
}
|
|
261
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsBounds, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
262
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.11", type: NgtsBounds, isStandalone: true, selector: "ngts-bounds", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "groupRef", first: true, predicate: ["group"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
263
|
-
<ngt-group #group>
|
|
264
|
-
<ng-content />
|
|
265
|
-
</ngt-group>
|
|
266
|
-
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
267
|
-
}
|
|
268
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsBounds, decorators: [{
|
|
269
|
-
type: Component,
|
|
270
|
-
args: [{
|
|
271
|
-
selector: 'ngts-bounds',
|
|
272
|
-
standalone: true,
|
|
273
|
-
template: `
|
|
274
|
-
<ngt-group #group>
|
|
275
|
-
<ng-content />
|
|
276
|
-
</ngt-group>
|
|
277
|
-
`,
|
|
278
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
279
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
280
|
-
}]
|
|
281
|
-
}], ctorParameters: () => [] });
|
|
282
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm91bmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL3N0YWdpbmcvc3JjL2xpYi9ib3VuZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLHVCQUF1QixFQUN2QixTQUFTLEVBQ1Qsc0JBQXNCLEVBQ3RCLE1BQU0sRUFFTixLQUFLLEVBRUwsU0FBUyxFQUNULFNBQVMsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQVksSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQVksVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQzs7QUFXNUUsSUFBSyxjQUlKO0FBSkQsV0FBSyxjQUFjO0lBQ2xCLG1EQUFRLENBQUE7SUFDUixxREFBUyxDQUFBO0lBQ1QsdURBQVUsQ0FBQTtBQUNYLENBQUMsRUFKSSxjQUFjLEtBQWQsY0FBYyxRQUlsQjtBQUVELFNBQVMsTUFBTSxDQUFDLEdBQVk7SUFDM0IsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFLLEdBQVksQ0FBQyxNQUFNLENBQUM7QUFDdEMsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsQ0FBUztJQUN4QyxvREFBb0Q7SUFDcEQsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFXRCxNQUFNLGNBQWMsR0FBc0I7SUFDekMsV0FBVyxFQUFFLEdBQUc7SUFDaEIsTUFBTSxFQUFFLEdBQUc7SUFDWCxlQUFlLEVBQUUsc0JBQXNCO0lBQ3ZDLElBQUksRUFBRSxL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QkFBb0IsQ0FBQyxJQUFJLE9BQU8sRUFBRSxFQUFFLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBRTdCLE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUVELEtBQUs7UUFDSixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDMUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFNUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbEUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUss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QyxDQUFDLENBQUM7UUFFbkgsSUFBSSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3BDLHFFQUFxRTtZQUNyRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyQixDQUFDO1FBRUQsa0VBQWtFO1FBQ2xFLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsTUFBTSxRQUFRLEdBQUc7WUFDaEIsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDM0QsQ0FBQztRQUVGLHVEQUF1RDtRQUN2RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDbkQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUN4QyxNQUFNLFFBQVEsR0FBRyxNQUFNO1lBQ3RCLENBQUMsQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDakUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztRQUM3QixLQUFLLE1BQU0sQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzFCLENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekIsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELFNBQVMsSUFBSSxDQUFDLENBQUM7UUFDZixRQUFRLElBQUksQ0FBQyxDQUFDO1FBQ2QsTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDL0QsTUFBTSxZQUFZLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUM7UUFFN0QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBRW5FLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQztRQUMzQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVYLE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUVELElBQUk7UUFDSCxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRztZQUN0QyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUN0QixTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUN4QixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztTQUMxQixDQUFDO1FBQ0YsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUVwQyxNQUFNLENBQUMsSUFBSSxHQUFHLFFBQVEsR0FBRyxHQUFHLENBQUM7UUFDN0IsTUFBTSxDQUFDLEdBQUcsR0FBRyxRQUFRLEdBQUcsR0FBRyxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRWhDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDZCxRQUFRLENBQUMsV0FBVyxHQUFHLFFBQVEsR0FBRyxFQUFFLENBQUM7WUFDckMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25CLENBQUM7UUFFRCxVQUFVLEVBQUUsQ0FBQztRQUViLE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQzsrR0FwUlcsVUFBVTttR0FBVixVQUFVLG9VQVJaOzs7O0VBSVQ7OzRGQUlXLFVBQVU7a0JBWHRCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7Ozs7RUFJVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDakMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQy9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0ZWZmZWN0LFxuXHRFbGVtZW50UmVmLFxuXHRpbnB1dCxcblx0U2lnbmFsLFxuXHR1bnRyYWNrZWQsXG5cdHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBleHRlbmQsIGluamVjdEJlZm9yZVJlbmRlciwgaW5qZWN0U3RvcmUsIGlzLCBOZ3RHcm91cCwgcGljayB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgbWVyZ2VJbnB1dHMgfSBmcm9tICduZ3h0ZW5zaW9uL2luamVjdC1pbnB1dHMnO1xuaW1wb3J0IHsgQm94MywgR3JvdXAsIE1hdHJpeDQsIE9iamVjdDNELCBRdWF0ZXJuaW9uLCBWZWN0b3IzIH0gZnJvbSAndGhyZWUnO1xuXG5pbnRlcmZhY2UgQ29udHJvbHNQcm90byB7XG5cdHVwZGF0ZSgpOiB2b2lkO1xuXG5cdHRhcmdldDogVmVjdG9yMztcblx0bWF4RGlzdGFuY2U6IG51bWJlcjtcblx0YWRkRXZlbnRMaXN0ZW5lcjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAoZXZlbnQ6IGFueSkgPT4gdm9pZCkgPT4gdm9pZDtcblx0cmVtb3ZlRXZlbnRMaXN0ZW5lcjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAoZXZlbnQ6IGFueSkgPT4gdm9pZCkgPT4gdm9pZDtcbn1cblxuZW51bSBBbmltYXRpb25TdGF0ZSB7XG5cdE5PTkUgPSAwLFxuXHRTVEFSVCA9IDEsXG5cdEFDVElWRSA9IDIsXG59XG5cbmZ1bmN0aW9uIGlzQm94MyhkZWY6IHVua25vd24pOiBkZWYgaXMgQm94MyB7XG5cdHJldHVybiAhIWRlZiAmJiAoZGVmIGFzIEJveDMpLmlzQm94Mztcbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVGdW5jRGVmYXVsdCh0OiBudW1iZXIpIHtcblx0Ly8gSW1pdGF0ZXMgdGhlIHByZXZpb3VzbHkgdXNlZCBUSFJFRS5NYXRoVXRpbHMuZGFtcFxuXHRyZXR1cm4gMSAtIE1hdGguZXhwKC01ICogdCkgKyAwLjAwNyAqIHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0c0JvdW5kc09wdGlvbnMgZXh0ZW5kcyBQYXJ0aWFsPE5ndEdyb3VwPiB7XG5cdG1heER1cmF0aW9uOiBudW1iZXI7XG5cdG1hcmdpbjogbnVtYmVyO1xuXHRvYnNlcnZlOiBib29sZWFuO1xuXHRmaXQ6IGJvb2xlYW47XG5cdGNsaXA6IGJvb2xlYW47XG5cdGludGVycG9sYXRlRnVuYzogKHQ6IG51bWJlcikgPT4gbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogTmd0c0JvdW5kc09wdGlvbnMgPSB7XG5cdG1heER1cmF0aW9uOiAxLjAsXG5cdG1hcmdpbjogMS4yLFxuXHRpbnRlcnBvbGF0ZUZ1bmM6IGludGVycG9sYXRlRnVuY0RlZmF1bHQsXG5cdGNsaXA6IGZhbHNlLFxuXHRmaXQ6IGZhbHNlLFxuXHRvYnNlcnZlOiBmYWxzZSxcbn07XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHMtYm91bmRzJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LWdyb3VwICNncm91cD5cblx0XHRcdDxuZy1jb250ZW50IC8+XG5cdFx0PC9uZ3QtZ3JvdXA+XG5cdGAsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNCb3VuZHMge1xuXHRvcHRpb25zID0gaW5wdXQoZGVmYXVsdE9wdGlvbnMsIHsgdHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0T3B0aW9ucykgfSk7XG5cblx0Z3JvdXBSZWYgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxHcm91cD4+KCdncm91cCcpO1xuXG5cdHByaXZhdGUgc3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXHRwcml2YXRlIGNhbWVyYSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdjYW1lcmEnKTtcblx0cHJpdmF0ZSBpbnZhbGlkYXRlID0gdGhpcy5zdG9yZS5zZWxlY3QoJ2ludmFsaWRhdGUnKTtcblx0cHJpdmF0ZSBzaXplID0gdGhpcy5zdG9yZS5zZWxlY3QoJ3NpemUnKTtcblx0cHJpdmF0ZSBjb250cm9scyA9IHRoaXMuc3RvcmUuc2VsZWN0KCdjb250cm9scycpIGFzIHVua25vd24gYXMgU2lnbmFsPENvbnRyb2xzUHJvdG8+O1xuXG5cdHByaXZhdGUgY2xpcE9wdGlvbiA9IHBpY2sodGhpcy5vcHRpb25zLCAnY2xpcCcpO1xuXHRwcml2YXRlIGZpdE9wdGlvbiA9IHBpY2sodGhpcy5vcHRpb25zLCAnZml0Jyk7XG5cdHByaXZhdGUgb2JzZXJ2ZSA9IHBpY2sodGhpcy5vcHRpb25zLCAnb2JzZXJ2ZScpO1xuXG5cdHByaXZhdGUgb3JpZ2luID0ge1xuXHRcdGNhbVBvczogbmV3IFZlY3RvcjMoKSxcblx0XHRjYW1Sb3Q6IG5ldyBRdWF0ZXJuaW9uKCksXG5cdFx0Y2FtWm9vbTogMSxcblx0fTtcblx0cHJpdmF0ZSBnb2FsID0ge1xuXHRcdGNhbVBvczogdW5kZWZpbmVkIGFzIFZlY3RvcjMgfCB1bmRlZmluZWQsXG5cdFx0Y2FtUm90OiB1bmRlZmluZWQgYXMgUXVhdGVybmlvbiB8IHVuZGVmaW5lZCxcblx0XHRjYW1ab29tOiB1bmRlZmluZWQgYXMgbnVtYmVyIHwgdW5kZWZpbmVkLFxuXHRcdGNhbVVwOiB1bmRlZmluZWQgYXMgVmVjdG9yMyB8IHVuZGVmaW5lZCxcblx0XHR0YXJnZXQ6IHVuZGVmaW5lZCBhcyBWZWN0b3IzIHwgdW5kZWZpbmVkLFxuXHR9O1xuXHRwcml2YXRlIGFuaW1hdGlvblN0YXRlID0gQW5pbWF0aW9uU3RhdGUuTk9ORTtcblxuXHQvLyByZXByZXNlbnQgYW5pbWF0aW9uIHN0YXRlIGZyb20gMCB0byAxXG5cdHByaXZhdGUgdCA9IDA7XG5cdHByaXZhdGUgYm94ID0gbmV3IEJveDMoKTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRleHRlbmQoeyBHcm91cCB9KTtcblxuXHRcdGVmZmVjdCgob25DbGVhbnVwKSA9PiB7XG5cdFx0XHRjb25zdCBbY29udHJvbHMsIGNhbWVyYV0gPSBbdGhpcy5jb250cm9scygpLCB1bnRyYWNrZWQodGhpcy5jYW1lcmEpXTtcblx0XHRcdGlmICghY29udHJvbHMpIHJldHVybjtcblxuXHRcdFx0Y29uc3QgY2FsbGJhY2sgPSAoKSA9PiB7XG5cdFx0XHRcdGlmIChjb250cm9scyAmJiB0aGlzLmdvYWwudGFyZ2V0ICYmIHRoaXMuYW5pbWF0aW9uU3RhdGUgIT09IEFuaW1hdGlvblN0YXRlLk5PTkUpIHtcblx0XHRcdFx0XHRjb25zdCBmcm9udCA9IG5ldyBWZWN0b3IzKCkuc2V0RnJvbU1hdHJpeENvbHVtbihjYW1lcmEubWF0cml4LCAyKTtcblx0XHRcdFx0XHRjb25zdCBkMCA9IHRoaXMub3JpZ2luLmNhbVBvcy5kaXN0YW5jZVRvKGNvbnRyb2xzLnRhcmdldCk7XG5cdFx0XHRcdFx0Y29uc3QgZDEgPSAodGhpcy5nb2FsLmNhbVBvcyB8fCB0aGlzLm9yaWdpbi5jYW1Qb3MpLmRpc3RhbmNlVG8odGhpcy5nb2FsLnRhcmdldCk7XG5cdFx0XHRcdFx0Y29uc3QgZCA9ICgxIC0gdGhpcy50KSAqIGQwICsgdGhpcy50ICogZDE7XG5cblx0XHRcdFx0XHRjb250cm9scy50YXJnZXQuY29weShjYW1lcmEucG9zaXRpb24pLmFkZFNjYWxlZFZlY3Rvcihmcm9udCwgLWQpO1xuXHRcdFx0XHRcdGNvbnRyb2xzLnVwZGF0ZSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5hbmltYXRpb25TdGF0ZSA9IEFuaW1hdGlvblN0YXRlLk5PTkU7XG5cdFx0XHR9O1xuXG5cdFx0XHRjb250cm9scy5hZGRFdmVudExpc3RlbmVyKCdzdGFydCcsIGNhbGxiYWNrKTtcblx0XHRcdG9uQ2xlYW51cCgoKSA9PiBjb250cm9scy5yZW1vdmVFdmVudExpc3RlbmVyKCdzdGFydCcsIGNhbGxiYWNrKSk7XG5cdFx0fSk7XG5cblx0XHRsZXQgY291bnQgPSAwO1xuXHRcdGVmZmVjdCgoKSA9PiB7XG5cdFx0XHRjb25zdCBbY2xpcCwgZml0LCBvYnNlcnZlXSA9IFtcblx0XHRcdFx0dGhpcy5jbGlwT3B0aW9uKCksXG5cdFx0XHRcdHRoaXMuZml0T3B0aW9uKCksXG5cdFx0XHRcdHRoaXMub2JzZXJ2ZSgpLFxuXHRcdFx0XHR0aGlzLnNpemUoKSxcblx0XHRcdFx0dGhpcy5jYW1lcmEoKSxcblx0XHRcdFx0dGhpcy5jb250cm9scygpLFxuXHRcdFx0XTtcblx0XHRcdGlmIChvYnNlcnZlIHx8IGNvdW50KysgPT09IDApIHtcblx0XHRcdFx0dGhpcy5yZWZyZXNoKCk7XG5cdFx0XHRcdGlmIChmaXQpIHRoaXMucmVzZXQoKS5maXQoKTtcblx0XHRcdFx0aWYgKGNsaXApIHRoaXMuY2xpcCgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aW5qZWN0QmVmb3JlUmVuZGVyKCh7IGRlbHRhIH0pID0+IHtcblx0XHRcdC8vIFRoaXMgW2FkZGl0aW9uYWwgYW5pbWF0aW9uIHN0ZXAgU1RBUlRdIGlzIG5lZWRlZCB0byBndWFyYW50ZWUgdGhhdCBkZWx0YSB1c2VkIGluIGFuaW1hdGlvbiBpc24ndCBhYnN1cmRseSBoaWdoICgyLTMgc2Vjb25kcykgd2hpY2ggaXMgYWN0dWFsbHkgcG9zc2libGUgaWYgcmVuZGVyaW5nIGhhcHBlbnMgb24gZGVtYW5kLi4uXG5cdFx0XHRpZiAodGhpcy5hbmltYXRpb25TdGF0ZSA9PT0gQW5pbWF0aW9uU3RhdGUuU1RBUlQpIHtcblx0XHRcdFx0dGhpcy5hbmltYXRpb25TdGF0ZSA9IEFuaW1hdGlvblN0YXRlLkFDVElWRTtcblx0XHRcdFx0dGhpcy5pbnZhbGlkYXRlKCk7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuYW5pbWF0aW9uU3RhdGUgPT09IEFuaW1hdGlvblN0YXRlLkFDVElWRSkge1xuXHRcdFx0XHRjb25zdCBbeyBtYXhEdXJhdGlvbiwgaW50ZXJwb2xhdGVGdW5jIH0sIGNhbWVyYSwgY29udHJvbHMsIGludmFsaWRhdGVdID0gW1xuXHRcdFx0XHRcdHRoaXMub3B0aW9ucygpLFxuXHRcdFx0XHRcdHRoaXMuY2FtZXJhKCksXG5cdFx0XHRcdFx0dGhpcy5jb250cm9scygpLFxuXHRcdFx0XHRcdHRoaXMuaW52YWxpZGF0ZSgpLFxuXHRcdFx0XHRdO1xuXHRcdFx0XHR0aGlzLnQgKz0gZGVsdGEgLyBtYXhEdXJhdGlvbjtcblxuXHRcdFx0XHRpZiAodGhpcy50ID49IDEpIHtcblx0XHRcdFx0XHR0aGlzLmdvYWwuY2FtUG9zICYmIGNhbWVyYS5wb3NpdGlvbi5jb3B5KHRoaXMuZ29hbC5jYW1Qb3MpO1xuXHRcdFx0XHRcdHRoaXMuZ29hbC5jYW1Sb3QgJiYgY2FtZXJhLnF1YXRlcm5pb24uY29weSh0aGlzLmdvYWwuY2FtUm90KTtcblx0XHRcdFx0XHR0aGlzLmdvYWwuY2FtVXAgJiYgY2FtZXJhLnVwLmNvcHkodGhpcy5nb2FsLmNhbVVwKTtcblx0XHRcdFx0XHR0aGlzLmdvYWwuY2FtWm9vbSAmJiBpcy5vcnRob2dyYXBoaWNDYW1lcmEoY2FtZXJhKSAmJiAoY2FtZXJhLnpvb20gPSB0aGlzLmdvYWwuY2FtWm9vbSk7XG5cblx0XHRcdFx0XHRjYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcblx0XHRcdFx0XHRjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdFx0XHRcdFx0aWYgKGNvbnRyb2xzICYmIHRoaXMuZ29hbC50YXJnZXQpIHtcblx0XHRcdFx0XHRcdGNvbnRyb2xzLnRhcmdldC5jb3B5KHRoaXMuZ29hbC50YXJnZXQpO1xuXHRcdFx0XHRcdFx0Y29udHJvbHMudXBkYXRlKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5hbmltYXRpb25TdGF0ZSA9IEFuaW1hdGlvblN0YXRlLk5PTkU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgayA9IGludGVycG9sYXRlRnVuYyh0aGlzLnQpO1xuXG5cdFx0XHRcdFx0dGhpcy5nb2FsLmNhbVBvcyAmJiBjYW1lcmEucG9zaXRpb24ubGVycFZlY3RvcnModGhpcy5vcmlnaW4uY2FtUG9zLCB0aGlzLmdvYWwuY2FtUG9zLCBrKTtcblx0XHRcdFx0XHR0aGlzLmdvYWwuY2FtUm90ICYmIGNhbWVyYS5xdWF0ZXJuaW9uLnNsZXJwUXVhdGVybmlvbnModGhpcy5vcmlnaW4uY2FtUm90LCB0aGlzLmdvYWwuY2FtUm90LCBrKTtcblx0XHRcdFx0XHR0aGlzLmdvYWwuY2FtVXAgJiYgY2FtZXJhLnVwLnNldCgwLCAxLCAwKS5hcHBseVF1YXRlcm5pb24oY2FtZXJhLnF1YXRlcm5pb24pO1xuXHRcdFx0XHRcdHRoaXMuZ29hbC5jYW1ab29tICYmXG5cdFx0XHRcdFx0XHRpcy5vcnRob2dyYXBoaWNDYW1lcmEoY2FtZXJhKSAmJlxuXHRcdFx0XHRcdFx0KGNhbWVyYS56b29tID0gKDEgLSBrKSAqIHRoaXMub3JpZ2luLmNhbVpvb20gKyBrICogdGhpcy5nb2FsLmNhbVpvb20pO1xuXG5cdFx0XHRcdFx0Y2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cdFx0XHRcdFx0Y2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGludmFsaWRhdGUoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdGdldFNpemUoKSB7XG5cdFx0Y29uc3QgW2NhbWVyYSwgeyBtYXJnaW4gfV0gPSBbdW50cmFja2VkKHRoaXMuY2FtZXJhKSwgdW50cmFja2VkKHRoaXMub3B0aW9ucyldO1xuXG5cdFx0Y29uc3QgYm94U2l6ZSA9IHRoaXMuYm94LmdldFNpemUobmV3IFZlY3RvcjMoKSk7XG5cdFx0Y29uc3QgY2VudGVyID0gdGhpcy5ib3guZ2V0Q2VudGVyKG5ldyBWZWN0b3IzKCkpO1xuXHRcdGNvbnN0IG1heFNpemUgPSBNYXRoLm1heChib3hTaXplLngsIGJveFNpemUueSwgYm94U2l6ZS56KTtcblx0XHRjb25zdCBmaXRIZWlnaHREaXN0YW5jZSA9IGlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpXG5cdFx0XHQ/IG1heFNpemUgKiA0XG5cdFx0XHQ6IG1heFNpemUgLyAoMiAqIE1hdGguYXRhbigoTWF0aC5QSSAqIGNhbWVyYS5mb3YpIC8gMzYwKSk7XG5cdFx0Y29uc3QgZml0V2lkdGhEaXN0YW5jZSA9IGlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpID8gbWF4U2l6ZSAqIDQgOiBmaXRIZWlnaHREaXN0YW5jZSAvIGNhbWVyYS5hc3BlY3Q7XG5cdFx0Y29uc3QgZGlzdGFuY2UgPSBtYXJnaW4gKiBNYXRoLm1heChmaXRIZWlnaHREaXN0YW5jZSwgZml0V2lkdGhEaXN0YW5jZSk7XG5cblx0XHRyZXR1cm4geyBib3g6IHRoaXMuYm94LCBzaXplOiBib3hTaXplLCBjZW50ZXIsIGRpc3RhbmNlIH07XG5cdH1cblxuXHRyZWZyZXNoKG9iamVjdD86IE9iamVjdDNEIHwgQm94Mykge1xuXHRcdGNvbnN0IFtncm91cCwgY2FtZXJhXSA9IFt1bnRyYWNrZWQodGhpcy5ncm91cFJlZikubmF0aXZlRWxlbWVudCwgdW50cmFja2VkKHRoaXMuY2FtZXJhKV07XG5cblx0XHRpZiAoaXNCb3gzKG9iamVjdCkpIHRoaXMuYm94LmNvcHkob2JqZWN0KTtcblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IHRhcmdldCA9IG9iamVjdCB8fCBncm91cDtcblx0XHRcdGlmICghdGFyZ2V0KSByZXR1cm4gdGhpcztcblx0XHRcdHRhcmdldC51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCB0cnVlKTtcblx0XHRcdHRoaXMuYm94LnNldEZyb21PYmplY3QodGFyZ2V0KTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuYm94LmlzRW1wdHkoKSkge1xuXHRcdFx0Y29uc3QgbWF4ID0gY2FtZXJhLnBvc2l0aW9uLmxlbmd0aCgpIHx8IDEwO1xuXHRcdFx0dGhpcy5ib3guc2V0RnJvbUNlbnRlckFuZFNpemUobmV3IFZlY3RvcjMoKSwgbmV3IFZlY3RvcjMobWF4LCBtYXgsIG1heCkpO1xuXHRcdH1cblxuXHRcdHRoaXMub3JpZ2luLmNhbVBvcy5jb3B5KGNhbWVyYS5wb3NpdGlvbik7XG5cdFx0dGhpcy5vcmlnaW4uY2FtUm90LmNvcHkoY2FtZXJhLnF1YXRlcm5pb24pO1xuXHRcdGlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpICYmICh0aGlzLm9yaWdpbi5jYW1ab29tID0gY2FtZXJhLnpvb20pO1xuXG5cdFx0dGhpcy5nb2FsLmNhbVBvcyA9IHVuZGVmaW5lZDtcblx0XHR0aGlzLmdvYWwuY2FtUm90ID0gdW5kZWZpbmVkO1xuXHRcdHRoaXMuZ29hbC5jYW1ab29tID0gdW5kZWZpbmVkO1xuXHRcdHRoaXMuZ29hbC5jYW1VcCA9IHVuZGVmaW5lZDtcblx0XHR0aGlzLmdvYWwudGFyZ2V0ID0gdW5kZWZpbmVkO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRyZXNldCgpIHtcblx0XHRjb25zdCBbY2FtZXJhXSA9IFt1bnRyYWNrZWQodGhpcy5jYW1lcmEpXTtcblx0XHRjb25zdCB7IGNlbnRlciwgZGlzdGFuY2UgfSA9IHRoaXMuZ2V0U2l6ZSgpO1xuXG5cdFx0Y29uc3QgZGlyZWN0aW9uID0gY2FtZXJhLnBvc2l0aW9uLmNsb25lKCkuc3ViKGNlbnRlcikubm9ybWFsaXplKCk7XG5cdFx0dGhpcy5nb2FsLmNhbVBvcyA9IGNlbnRlci5jbG9uZSgpLmFkZFNjYWxlZFZlY3RvcihkaXJlY3Rpb24sIGRpc3RhbmNlKTtcblx0XHR0aGlzLmdvYWwudGFyZ2V0ID0gY2VudGVyLmNsb25lKCk7XG5cdFx0Y29uc3QgbUNhbVJvdCA9IG5ldyBNYXRyaXg0KCkubG9va0F0KHRoaXMuZ29hbC5jYW1Qb3MsIHRoaXMuZ29hbC50YXJnZXQsIGNhbWVyYS51cCk7XG5cdFx0dGhpcy5nb2FsLmNhbVJvdCA9IG5ldyBRdWF0ZXJuaW9uKCkuc2V0RnJvbVJvdGF0aW9uTWF0cml4KG1DYW1Sb3QpO1xuXG5cdFx0dGhpcy5hbmltYXRpb25TdGF0ZSA9IEFuaW1hdGlvblN0YXRlLlNUQVJUO1xuXHRcdHRoaXMudCA9IDA7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdG1vdmVUbyhwb3NpdGlvbjogVmVjdG9yMyB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSkge1xuXHRcdHRoaXMuZ29hbC5jYW1Qb3MgPSBBcnJheS5pc0FycmF5KHBvc2l0aW9uKSA/IG5ldyBWZWN0b3IzKC4uLnBvc2l0aW9uKSA6IHBvc2l0aW9uLmNsb25lKCk7XG5cblx0XHR0aGlzLmFuaW1hdGlvblN0YXRlID0gQW5pbWF0aW9uU3RhdGUuU1RBUlQ7XG5cdFx0dGhpcy50ID0gMDtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0bG9va0F0KHsgdGFyZ2V0LCB1cCB9OiB7IHRhcmdldDogVmVjdG9yMyB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTsgdXA/OiBWZWN0b3IzIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXJdIH0pIHtcblx0XHRjb25zdCBbY2FtZXJhXSA9IFt1bnRyYWNrZWQodGhpcy5jYW1lcmEpXTtcblxuXHRcdHRoaXMuZ29hbC50YXJnZXQgPSBBcnJheS5pc0FycmF5KHRhcmdldCkgPyBuZXcgVmVjdG9yMyguLi50YXJnZXQpIDogdGFyZ2V0LmNsb25lKCk7XG5cdFx0aWYgKHVwKSB7XG5cdFx0XHR0aGlzLmdvYWwuY2FtVXAgPSBBcnJheS5pc0FycmF5KHVwKSA/IG5ldyBWZWN0b3IzKC4uLnVwKSA6IHVwLmNsb25lKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZ29hbC5jYW1VcCA9IGNhbWVyYS51cC5jbG9uZSgpO1xuXHRcdH1cblx0XHRjb25zdCBtQ2FtUm90ID0gbmV3IE1hdHJpeDQoKS5sb29rQXQodGhpcy5nb2FsLmNhbVBvcyB8fCBjYW1lcmEucG9zaXRpb24sIHRoaXMuZ29hbC50YXJnZXQsIHRoaXMuZ29hbC5jYW1VcCk7XG5cdFx0dGhpcy5nb2FsLmNhbVJvdCA9IG5ldyBRdWF0ZXJuaW9uKCkuc2V0RnJvbVJvdGF0aW9uTWF0cml4KG1DYW1Sb3QpO1xuXG5cdFx0dGhpcy5hbmltYXRpb25TdGF0ZSA9IEFuaW1hdGlvblN0YXRlLlNUQVJUO1xuXHRcdHRoaXMudCA9IDA7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdGZpdCgpIHtcblx0XHRjb25zdCBbY2FtZXJhLCBjb250cm9scywgeyBtYXJnaW4gfV0gPSBbdW50cmFja2VkKHRoaXMuY2FtZXJhKSwgdW50cmFja2VkKHRoaXMuY29udHJvbHMpLCB1bnRyYWNrZWQodGhpcy5vcHRpb25zKV07XG5cblx0XHRpZiAoIWlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpKSB7XG5cdFx0XHQvLyBGb3Igbm9uLW9ydGhvZ3JhcGhpYyBjYW1lcmFzLCBmaXQgc2hvdWxkIGJlaGF2ZSBleGFjdGx5IGxpa2UgcmVzZXRcblx0XHRcdHJldHVybiB0aGlzLnJlc2V0KCk7XG5cdFx0fVxuXG5cdFx0Ly8gRm9yIG9ydGhvZ3JhcGhpYyBjYW1lcmFzLCBmaXQgc2hvdWxkIG9ubHkgbW9kaWZ5IHRoZSB6b29tIHZhbHVlXG5cdFx0bGV0IG1heEhlaWdodCA9IDA7XG5cdFx0bGV0IG1heFdpZHRoID0gMDtcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtcblx0XHRcdG5ldyBWZWN0b3IzKHRoaXMuYm94Lm1pbi54LCB0aGlzLmJveC5taW4ueSwgdGhpcy5ib3gubWluLnopLFxuXHRcdFx0bmV3IFZlY3RvcjModGhpcy5ib3gubWluLngsIHRoaXMuYm94Lm1heC55LCB0aGlzLmJveC5taW4ueiksXG5cdFx0XHRuZXcgVmVjdG9yMyh0aGlzLmJveC5taW4ueCwgdGhpcy5ib3gubWluLnksIHRoaXMuYm94Lm1heC56KSxcblx0XHRcdG5ldyBWZWN0b3IzKHRoaXMuYm94Lm1pbi54LCB0aGlzLmJveC5tYXgueSwgdGhpcy5ib3gubWF4LnopLFxuXHRcdFx0bmV3IFZlY3RvcjModGhpcy5ib3gubWF4LngsIHRoaXMuYm94Lm1heC55LCB0aGlzLmJveC5tYXgueiksXG5cdFx0XHRuZXcgVmVjdG9yMyh0aGlzLmJveC5tYXgueCwgdGhpcy5ib3gubWF4LnksIHRoaXMuYm94Lm1pbi56KSxcblx0XHRcdG5ldyBWZWN0b3IzKHRoaXMuYm94Lm1heC54LCB0aGlzLmJveC5taW4ueSwgdGhpcy5ib3gubWF4LnopLFxuXHRcdFx0bmV3IFZlY3RvcjModGhpcy5ib3gubWF4LngsIHRoaXMuYm94Lm1pbi55LCB0aGlzLmJveC5taW4ueiksXG5cdFx0XTtcblxuXHRcdC8vIFRyYW5zZm9ybSB0aGUgY2VudGVyIGFuZCBlYWNoIGNvcm5lciB0byBjYW1lcmEgc3BhY2Vcblx0XHRjb25zdCBwb3MgPSB0aGlzLmdvYWwuY2FtUG9zIHx8IGNhbWVyYS5wb3NpdGlvbjtcblx0XHRjb25zdCB0YXJnZXQgPSB0aGlzLmdvYWwudGFyZ2V0IHx8IGNvbnRyb2xzLnRhcmdldDtcblx0XHRjb25zdCB1cCA9IHRoaXMuZ29hbC5jYW1VcCB8fCBjYW1lcmEudXA7XG5cdFx0Y29uc3QgbUNhbVdJbnYgPSB0YXJnZXRcblx0XHRcdD8gbmV3IE1hdHJpeDQoKS5sb29rQXQocG9zLCB0YXJnZXQsIHVwKS5zZXRQb3NpdGlvbihwb3MpLmludmVydCgpXG5cdFx0XHQ6IGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2U7XG5cdFx0Zm9yIChjb25zdCB2IG9mIHZlcnRpY2VzKSB7XG5cdFx0XHR2LmFwcGx5TWF0cml4NChtQ2FtV0ludik7XG5cdFx0XHRtYXhIZWlnaHQgPSBNYXRoLm1heChtYXhIZWlnaHQsIE1hdGguYWJzKHYueSkpO1xuXHRcdFx0bWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgTWF0aC5hYnModi54KSk7XG5cdFx0fVxuXHRcdG1heEhlaWdodCAqPSAyO1xuXHRcdG1heFdpZHRoICo9IDI7XG5cdFx0Y29uc3Qgem9vbUZvckhlaWdodCA9IChjYW1lcmEudG9wIC0gY2FtZXJhLmJvdHRvbSkgLyBtYXhIZWlnaHQ7XG5cdFx0Y29uc3Qgem9vbUZvcldpZHRoID0gKGNhbWVyYS5yaWdodCAtIGNhbWVyYS5sZWZ0KSAvIG1heFdpZHRoO1xuXG5cdFx0dGhpcy5nb2FsLmNhbVpvb20gPSBNYXRoLm1pbih6b29tRm9ySGVpZ2h0LCB6b29tRm9yV2lkdGgpIC8gbWFyZ2luO1xuXG5cdFx0dGhpcy5hbmltYXRpb25TdGF0ZSA9IEFuaW1hdGlvblN0YXRlLlNUQVJUO1xuXHRcdHRoaXMudCA9IDA7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdGNsaXAoKSB7XG5cdFx0Y29uc3QgW2NhbWVyYSwgY29udHJvbHMsIGludmFsaWRhdGVdID0gW1xuXHRcdFx0dW50cmFja2VkKHRoaXMuY2FtZXJhKSxcblx0XHRcdHVudHJhY2tlZCh0aGlzLmNvbnRyb2xzKSxcblx0XHRcdHVudHJhY2tlZCh0aGlzLmludmFsaWRhdGUpLFxuXHRcdF07XG5cdFx0Y29uc3QgeyBkaXN0YW5jZSB9ID0gdGhpcy5nZXRTaXplKCk7XG5cblx0XHRjYW1lcmEubmVhciA9IGRpc3RhbmNlIC8gMTAwO1xuXHRcdGNhbWVyYS5mYXIgPSBkaXN0YW5jZSAqIDEwMDtcblx0XHRjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdFx0aWYgKGNvbnRyb2xzKSB7XG5cdFx0XHRjb250cm9scy5tYXhEaXN0YW5jZSA9IGRpc3RhbmNlICogMTA7XG5cdFx0XHRjb250cm9scy51cGRhdGUoKTtcblx0XHR9XG5cblx0XHRpbnZhbGlkYXRlKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuIl19
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { Directive, effect, input, untracked } from '@angular/core';
|
|
2
|
-
import { injectBeforeRender, injectStore } from 'angular-three';
|
|
3
|
-
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
4
|
-
import { SimplexNoise } from 'three-stdlib';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
const defaultOptions = {
|
|
7
|
-
intensity: 1,
|
|
8
|
-
decayRate: 0.65,
|
|
9
|
-
maxYaw: 0.1,
|
|
10
|
-
maxPitch: 0.1,
|
|
11
|
-
maxRoll: 0.1,
|
|
12
|
-
yawFrequency: 0.1,
|
|
13
|
-
pitchFrequency: 0.1,
|
|
14
|
-
rollFrequency: 0.1,
|
|
15
|
-
};
|
|
16
|
-
export class NgtsCameraShake {
|
|
17
|
-
get intensity() {
|
|
18
|
-
return this.intensityOption;
|
|
19
|
-
}
|
|
20
|
-
set intensity(val) {
|
|
21
|
-
this.intensityOption = Math.min(1, Math.max(0, val));
|
|
22
|
-
}
|
|
23
|
-
constructor() {
|
|
24
|
-
this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
|
|
25
|
-
this.store = injectStore();
|
|
26
|
-
this.camera = this.store.select('camera');
|
|
27
|
-
this.defaultControls = this.store.select('controls');
|
|
28
|
-
this.initialRotation = untracked(this.camera).rotation.clone();
|
|
29
|
-
this.intensityOption = untracked(this.options).intensity;
|
|
30
|
-
this.yawNoise = new SimplexNoise();
|
|
31
|
-
this.pitchNoise = new SimplexNoise();
|
|
32
|
-
this.rollNoise = new SimplexNoise();
|
|
33
|
-
effect((onCleanup) => {
|
|
34
|
-
const defaultControls = this.defaultControls();
|
|
35
|
-
if (!defaultControls)
|
|
36
|
-
return;
|
|
37
|
-
const camera = this.camera();
|
|
38
|
-
const callback = () => void (this.initialRotation = camera.rotation.clone());
|
|
39
|
-
defaultControls.addEventListener('change', callback);
|
|
40
|
-
callback();
|
|
41
|
-
onCleanup(() => void defaultControls.removeEventListener('change', callback));
|
|
42
|
-
});
|
|
43
|
-
injectBeforeRender(({ delta, clock }) => {
|
|
44
|
-
const [{ maxYaw, yawFrequency, maxPitch, pitchFrequency, maxRoll, rollFrequency, decay, decayRate }, camera] = [
|
|
45
|
-
this.options(),
|
|
46
|
-
this.camera(),
|
|
47
|
-
];
|
|
48
|
-
const shake = Math.pow(this.intensity, 2);
|
|
49
|
-
const yaw = maxYaw * shake * this.yawNoise.noise(clock.elapsedTime * yawFrequency, 1);
|
|
50
|
-
const pitch = maxPitch * shake * this.pitchNoise.noise(clock.elapsedTime * pitchFrequency, 1);
|
|
51
|
-
const roll = maxRoll * shake * this.rollNoise.noise(clock.elapsedTime * rollFrequency, 1);
|
|
52
|
-
camera.rotation.set(this.initialRotation.x + pitch, this.initialRotation.y + yaw, this.initialRotation.z + roll);
|
|
53
|
-
if (decay && this.intensity > 0) {
|
|
54
|
-
this.intensity -= decayRate * delta;
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsCameraShake, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
59
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.11", type: NgtsCameraShake, isStandalone: true, selector: "ngts-camera-shake", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
|
|
60
|
-
}
|
|
61
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsCameraShake, decorators: [{
|
|
62
|
-
type: Directive,
|
|
63
|
-
args: [{ selector: 'ngts-camera-shake', standalone: true }]
|
|
64
|
-
}], ctorParameters: () => [] });
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FtZXJhLXNoYWtlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL3N0YWdpbmcvc3JjL2xpYi9jYW1lcmEtc2hha2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQXFCNUMsTUFBTSxjQUFjLEdBQTJCO0lBQzlDLFNBQVMsRUFBRSxDQUFDO0lBQ1osU0FBUyxFQUFFLElBQUk7SUFDZixNQUFNLEVBQUUsR0FBRztJQUNYLFFBQVEsRUFBRSxHQUFHO0lBQ2IsT0FBTyxFQUFFLEdBQUc7SUFDWixZQUFZLEVBQUUsR0FBRztJQUNqQixjQUFjLEVBQUUsR0FBRztJQUNuQixhQUFhLEVBQUUsR0FBRztDQUNsQixDQUFDO0FBR0YsTUFBTSxPQUFPLGVBQWU7SUFVM0IsSUFBSSxTQUFTO1FBQ1osT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFJLFNBQVMsQ0FBQyxHQUFXO1FBQ3hCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBTUQ7UUFyQkEsWUFBTyxHQUFHLEtBQUssQ0FBQyxjQUFjLEVBQUUsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVwRSxVQUFLLEdBQUcsV0FBVyxFQUFFLENBQUM7UUFD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QWYsZUFBZTs7NEZBQWYsZUFBZTtrQkFEM0IsU0FBUzttQkFBQyxFQUFFLFFBQVEsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBTaWduYWwsIGVmZmVjdCwgaW5wdXQsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaW5qZWN0QmVmb3JlUmVuZGVyLCBpbmplY3RTdG9yZSB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgbWVyZ2VJbnB1dHMgfSBmcm9tICduZ3h0ZW5zaW9uL2luamVjdC1pbnB1dHMnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7IFNpbXBsZXhOb2lzZSB9IGZyb20gJ3RocmVlLXN0ZGxpYic7XG5cbmludGVyZmFjZSBDb250cm9sc1Byb3RvIHtcblx0dXBkYXRlKCk6IHZvaWQ7XG5cdHRhcmdldDogVmVjdG9yMztcblx0YWRkRXZlbnRMaXN0ZW5lcjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAoZXZlbnQ6IGFueSkgPT4gdm9pZCkgPT4gdm9pZDtcblx0cmVtb3ZlRXZlbnRMaXN0ZW5lcjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAoZXZlbnQ6IGFueSkgPT4gdm9pZCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ3RzQ2FtZXJhU2hha2VPcHRpb25zIHtcblx0aW50ZW5zaXR5OiBudW1iZXI7XG5cdGRlY2F5PzogYm9vbGVhbjtcblx0ZGVjYXlSYXRlOiBudW1iZXI7XG5cdG1heFlhdzogbnVtYmVyO1xuXHRtYXhQaXRjaDogbnVtYmVyO1xuXHRtYXhSb2xsOiBudW1iZXI7XG5cdHlhd0ZyZXF1ZW5jeTogbnVtYmVyO1xuXHRwaXRjaEZyZXF1ZW5jeTogbnVtYmVyO1xuXHRyb2xsRnJlcXVlbmN5OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBOZ3RzQ2FtZXJhU2hha2VPcHRpb25zID0ge1xuXHRpbnRlbnNpdHk6IDEsXG5cdGRlY2F5UmF0ZTogMC42NSxcblx0bWF4WWF3OiAwLjEsXG5cdG1heFBpdGNoOiAwLjEsXG5cdG1heFJvbGw6IDAuMSxcblx0eWF3RnJlcXVlbmN5OiAwLjEsXG5cdHBpdGNoRnJlcXVlbmN5OiAwLjEsXG5cdHJvbGxGcmVxdWVuY3k6IDAuMSxcbn07XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ25ndHMtY2FtZXJhLXNoYWtlJywgc3RhbmRhbG9uZTogdHJ1ZSB9KVxuZXhwb3J0IGNsYXNzIE5ndHNDYW1lcmFTaGFrZSB7XG5cdG9wdGlvbnMgPSBpbnB1dChkZWZhdWx0T3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKGRlZmF1bHRPcHRpb25zKSB9KTtcblxuXHRwcml2YXRlIHN0b3JlID0gaW5qZWN0U3RvcmUoKTtcblx0cHJpdmF0ZSBjYW1lcmEgPSB0aGlzLnN0b3JlLnNlbGVjdCgnY2FtZXJhJyk7XG5cdHByaXZhdGUgZGVmYXVsdENvbnRyb2xzID0gdGhpcy5zdG9yZS5zZWxlY3QoJ2NvbnRyb2xzJykgYXMgdW5rbm93biBhcyBTaWduYWw8Q29udHJvbHNQcm90bz47XG5cblx0cHJpdmF0ZSBpbml0aWFsUm90YXRpb24gPSB1bnRyYWNrZWQodGhpcy5jYW1lcmEpLnJvdGF0aW9uLmNsb25lKCk7XG5cdHByaXZhdGUgaW50ZW5zaXR5T3B0aW9uID0gdW50cmFja2VkKHRoaXMub3B0aW9ucykuaW50ZW5zaXR5O1xuXG5cdGdldCBpbnRlbnNpdHkoKSB7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZW5zaXR5T3B0aW9uO1xuXHR9XG5cblx0c2V0IGludGVuc2l0eSh2YWw6IG51bWJlcikge1xuXHRcdHRoaXMuaW50ZW5zaXR5T3B0aW9uID0gTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgdmFsKSk7XG5cdH1cblxuXHRwcml2YXRlIHlhd05vaXNlID0gbmV3IFNpbXBsZXhOb2lzZSgpO1xuXHRwcml2YXRlIHBpdGNoTm9pc2UgPSBuZXcgU2ltcGxleE5vaXNlKCk7XG5cdHByaXZhdGUgcm9sbE5vaXNlID0gbmV3IFNpbXBsZXhOb2lzZSgpO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGVmZmVjdCgob25DbGVhbnVwKSA9PiB7XG5cdFx0XHRjb25zdCBkZWZhdWx0Q29udHJvbHMgPSB0aGlzLmRlZmF1bHRDb250cm9scygpO1xuXHRcdFx0aWYgKCFkZWZhdWx0Q29udHJvbHMpIHJldHVybjtcblx0XHRcdGNvbnN0IGNhbWVyYSA9IHRoaXMuY2FtZXJhKCk7XG5cblx0XHRcdGNvbnN0IGNhbGxiYWNrID0gKCkgPT4gdm9pZCAodGhpcy5pbml0aWFsUm90YXRpb24gPSBjYW1lcmEucm90YXRpb24uY2xvbmUoKSk7XG5cdFx0XHRkZWZhdWx0Q29udHJvbHMuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgY2FsbGJhY2spO1xuXHRcdFx0Y2FsbGJhY2soKTtcblxuXHRcdFx0b25DbGVhbnVwKCgpID0+IHZvaWQgZGVmYXVsdENvbnRyb2xzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGNhbGxiYWNrKSk7XG5cdFx0fSk7XG5cblx0XHRpbmplY3RCZWZvcmVSZW5kZXIoKHsgZGVsdGEsIGNsb2NrIH0pID0+IHtcblx0XHRcdGNvbnN0IFt7IG1heFlhdywgeWF3RnJlcXVlbmN5LCBtYXhQaXRjaCwgcGl0Y2hGcmVxdWVuY3ksIG1heFJvbGwsIHJvbGxGcmVxdWVuY3ksIGRlY2F5LCBkZWNheVJhdGUgfSwgY2FtZXJhXSA9IFtcblx0XHRcdFx0dGhpcy5vcHRpb25zKCksXG5cdFx0XHRcdHRoaXMuY2FtZXJhKCksXG5cdFx0XHRdO1xuXHRcdFx0Y29uc3Qgc2hha2UgPSBNYXRoLnBvdyh0aGlzLmludGVuc2l0eSwgMik7XG5cdFx0XHRjb25zdCB5YXcgPSBtYXhZYXcgKiBzaGFrZSAqIHRoaXMueWF3Tm9pc2Uubm9pc2UoY2xvY2suZWxhcHNlZFRpbWUgKiB5YXdGcmVxdWVuY3ksIDEpO1xuXHRcdFx0Y29uc3QgcGl0Y2ggPSBtYXhQaXRjaCAqIHNoYWtlICogdGhpcy5waXRjaE5vaXNlLm5vaXNlKGNsb2NrLmVsYXBzZWRUaW1lICogcGl0Y2hGcmVxdWVuY3ksIDEpO1xuXHRcdFx0Y29uc3Qgcm9sbCA9IG1heFJvbGwgKiBzaGFrZSAqIHRoaXMucm9sbE5vaXNlLm5vaXNlKGNsb2NrLmVsYXBzZWRUaW1lICogcm9sbEZyZXF1ZW5jeSwgMSk7XG5cblx0XHRcdGNhbWVyYS5yb3RhdGlvbi5zZXQodGhpcy5pbml0aWFsUm90YXRpb24ueCArIHBpdGNoLCB0aGlzLmluaXRpYWxSb3RhdGlvbi55ICsgeWF3LCB0aGlzLmluaXRpYWxSb3RhdGlvbi56ICsgcm9sbCk7XG5cblx0XHRcdGlmIChkZWNheSAmJiB0aGlzLmludGVuc2l0eSA+IDApIHtcblx0XHRcdFx0dGhpcy5pbnRlbnNpdHkgLT0gZGVjYXlSYXRlICogZGVsdGE7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cbiJdfQ==
|
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, effect, input, viewChild, } from '@angular/core';
|
|
2
|
-
import { extend, getLocalState, injectBeforeRender, omit, pick, resolveRef } from 'angular-three';
|
|
3
|
-
import { injectHelper, NgtsEdges } from 'angular-three-soba/abstractions';
|
|
4
|
-
import { injectFBO } from 'angular-three-soba/misc';
|
|
5
|
-
import { CausticsProjectionMaterial, createCausticsUpdate } from 'angular-three-soba/vanilla-exports';
|
|
6
|
-
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
7
|
-
import { CameraHelper, CustomBlending, FloatType, Group, LinearFilter, LinearMipmapLinearFilter, LineBasicMaterial, Mesh, OneFactor, OrthographicCamera, PlaneGeometry, Scene, SrcAlphaFactor, UnsignedByteType, Vector3, } from 'three';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
const NORMAL_OPTIONS = {
|
|
10
|
-
depth: true,
|
|
11
|
-
minFilter: LinearFilter,
|
|
12
|
-
magFilter: LinearFilter,
|
|
13
|
-
type: UnsignedByteType,
|
|
14
|
-
};
|
|
15
|
-
const CAUSTIC_OPTIONS = {
|
|
16
|
-
minFilter: LinearMipmapLinearFilter,
|
|
17
|
-
magFilter: LinearFilter,
|
|
18
|
-
type: FloatType,
|
|
19
|
-
generateMipmaps: true,
|
|
20
|
-
};
|
|
21
|
-
const defaultOptions = {
|
|
22
|
-
frames: 1,
|
|
23
|
-
debug: false,
|
|
24
|
-
causticsOnly: false,
|
|
25
|
-
backside: false,
|
|
26
|
-
ior: 1.1,
|
|
27
|
-
backsideIOR: 1.1,
|
|
28
|
-
worldRadius: 0.3125,
|
|
29
|
-
intensity: 0.05,
|
|
30
|
-
color: 'white',
|
|
31
|
-
resolution: 2024,
|
|
32
|
-
lightSource: [5, 5, 5],
|
|
33
|
-
};
|
|
34
|
-
export class NgtsCaustics {
|
|
35
|
-
constructor() {
|
|
36
|
-
this.Math = Math;
|
|
37
|
-
this.CustomBlending = CustomBlending;
|
|
38
|
-
this.OneFactor = OneFactor;
|
|
39
|
-
this.SrcAlphaFactor = SrcAlphaFactor;
|
|
40
|
-
this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
|
|
41
|
-
this.parameters = omit(this.options, [
|
|
42
|
-
'frames',
|
|
43
|
-
'debug',
|
|
44
|
-
'causticsOnly',
|
|
45
|
-
'backside',
|
|
46
|
-
'ior',
|
|
47
|
-
'backsideIOR',
|
|
48
|
-
'worldRadius',
|
|
49
|
-
'intensity',
|
|
50
|
-
'color',
|
|
51
|
-
'resolution',
|
|
52
|
-
'lightSource',
|
|
53
|
-
]);
|
|
54
|
-
this.debug = pick(this.options, 'debug');
|
|
55
|
-
this.color = pick(this.options, 'color');
|
|
56
|
-
this.resolution = pick(this.options, 'resolution');
|
|
57
|
-
this.groupRef = viewChild.required('group');
|
|
58
|
-
this.sceneRef = viewChild.required('scene');
|
|
59
|
-
this.cameraRef = viewChild.required('camera');
|
|
60
|
-
this.planeRef = viewChild.required('plane');
|
|
61
|
-
this.normalTargetParams = computed(() => ({
|
|
62
|
-
width: this.resolution(),
|
|
63
|
-
height: this.resolution(),
|
|
64
|
-
settings: NORMAL_OPTIONS,
|
|
65
|
-
}));
|
|
66
|
-
// Buffers for front and back faces
|
|
67
|
-
this.normalTarget = injectFBO(this.normalTargetParams);
|
|
68
|
-
this.normalTargetB = injectFBO(this.normalTargetParams);
|
|
69
|
-
this.causticsTargetParams = computed(() => ({
|
|
70
|
-
width: this.resolution(),
|
|
71
|
-
height: this.resolution(),
|
|
72
|
-
settings: CAUSTIC_OPTIONS,
|
|
73
|
-
}));
|
|
74
|
-
this.causticsTarget = injectFBO(this.causticsTargetParams);
|
|
75
|
-
this.causticsTargetB = injectFBO(this.causticsTargetParams);
|
|
76
|
-
this.cameraHelper = injectHelper(() => (this.debug() ? this.cameraRef().nativeElement : null), () => CameraHelper);
|
|
77
|
-
extend({ CausticsProjectionMaterial, Group, Scene, Mesh, PlaneGeometry, LineBasicMaterial, OrthographicCamera });
|
|
78
|
-
effect(() => {
|
|
79
|
-
// track all changes
|
|
80
|
-
const [group, scene, plane] = [
|
|
81
|
-
this.groupRef().nativeElement,
|
|
82
|
-
this.sceneRef().nativeElement,
|
|
83
|
-
this.planeRef().nativeElement,
|
|
84
|
-
this.options(),
|
|
85
|
-
];
|
|
86
|
-
const groupLocalState = getLocalState(group);
|
|
87
|
-
const sceneLocalState = getLocalState(scene);
|
|
88
|
-
const planeLocalState = getLocalState(plane);
|
|
89
|
-
if (!groupLocalState || !sceneLocalState || !planeLocalState)
|
|
90
|
-
return;
|
|
91
|
-
groupLocalState.objects();
|
|
92
|
-
sceneLocalState.objects();
|
|
93
|
-
planeLocalState.objects();
|
|
94
|
-
planeLocalState.nonObjects();
|
|
95
|
-
group.updateWorldMatrix(false, true);
|
|
96
|
-
});
|
|
97
|
-
const update = createCausticsUpdate(() => {
|
|
98
|
-
const { lightSource, ...rest } = this.options();
|
|
99
|
-
return {
|
|
100
|
-
params: Object.assign(rest, {
|
|
101
|
-
lightSource: Array.isArray(lightSource) ? new Vector3(...lightSource) : resolveRef(lightSource),
|
|
102
|
-
}),
|
|
103
|
-
normalTarget: this.normalTarget(),
|
|
104
|
-
normalTargetB: this.normalTargetB(),
|
|
105
|
-
causticsTarget: this.causticsTarget(),
|
|
106
|
-
causticsTargetB: this.causticsTargetB(),
|
|
107
|
-
camera: this.cameraRef().nativeElement,
|
|
108
|
-
scene: this.sceneRef().nativeElement,
|
|
109
|
-
group: this.groupRef().nativeElement,
|
|
110
|
-
plane: this.planeRef().nativeElement,
|
|
111
|
-
helper: this.cameraHelper(),
|
|
112
|
-
};
|
|
113
|
-
});
|
|
114
|
-
injectBeforeRender(({ gl }) => update(gl));
|
|
115
|
-
}
|
|
116
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsCaustics, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
117
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: NgtsCaustics, isStandalone: true, selector: "ngts-caustics", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "groupRef", first: true, predicate: ["group"], descendants: true, isSignal: true }, { propertyName: "sceneRef", first: true, predicate: ["scene"], descendants: true, isSignal: true }, { propertyName: "cameraRef", first: true, predicate: ["camera"], descendants: true, isSignal: true }, { propertyName: "planeRef", first: true, predicate: ["plane"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
118
|
-
<ngt-group #group [parameters]="parameters()">
|
|
119
|
-
<ngt-scene #scene>
|
|
120
|
-
<ngt-orthographic-camera #camera [up]="[0, 1, 0]" />
|
|
121
|
-
<ng-content />
|
|
122
|
-
</ngt-scene>
|
|
123
|
-
|
|
124
|
-
<ngt-mesh #plane [renderOrder]="2" [rotation]="[-Math.PI / 2, 0, 0]">
|
|
125
|
-
<ngt-plane-geometry />
|
|
126
|
-
<ngt-caustics-projection-material
|
|
127
|
-
[transparent]="true"
|
|
128
|
-
[color]="color()"
|
|
129
|
-
[causticsTexture]="causticsTarget().texture"
|
|
130
|
-
[causticsTextureB]="causticsTargetB().texture"
|
|
131
|
-
[blending]="CustomBlending"
|
|
132
|
-
[blendSrc]="OneFactor"
|
|
133
|
-
[blendDst]="SrcAlphaFactor"
|
|
134
|
-
[depthWrite]="false"
|
|
135
|
-
/>
|
|
136
|
-
|
|
137
|
-
@if (debug()) {
|
|
138
|
-
<ngts-edges>
|
|
139
|
-
<ngt-line-basic-material color="#ffff00" [toneMapped]="false" />
|
|
140
|
-
</ngts-edges>
|
|
141
|
-
}
|
|
142
|
-
</ngt-mesh>
|
|
143
|
-
</ngt-group>
|
|
144
|
-
`, isInline: true, dependencies: [{ kind: "component", type: NgtsEdges, selector: "ngts-edges", inputs: ["options"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
145
|
-
}
|
|
146
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsCaustics, decorators: [{
|
|
147
|
-
type: Component,
|
|
148
|
-
args: [{
|
|
149
|
-
selector: 'ngts-caustics',
|
|
150
|
-
standalone: true,
|
|
151
|
-
template: `
|
|
152
|
-
<ngt-group #group [parameters]="parameters()">
|
|
153
|
-
<ngt-scene #scene>
|
|
154
|
-
<ngt-orthographic-camera #camera [up]="[0, 1, 0]" />
|
|
155
|
-
<ng-content />
|
|
156
|
-
</ngt-scene>
|
|
157
|
-
|
|
158
|
-
<ngt-mesh #plane [renderOrder]="2" [rotation]="[-Math.PI / 2, 0, 0]">
|
|
159
|
-
<ngt-plane-geometry />
|
|
160
|
-
<ngt-caustics-projection-material
|
|
161
|
-
[transparent]="true"
|
|
162
|
-
[color]="color()"
|
|
163
|
-
[causticsTexture]="causticsTarget().texture"
|
|
164
|
-
[causticsTextureB]="causticsTargetB().texture"
|
|
165
|
-
[blending]="CustomBlending"
|
|
166
|
-
[blendSrc]="OneFactor"
|
|
167
|
-
[blendDst]="SrcAlphaFactor"
|
|
168
|
-
[depthWrite]="false"
|
|
169
|
-
/>
|
|
170
|
-
|
|
171
|
-
@if (debug()) {
|
|
172
|
-
<ngts-edges>
|
|
173
|
-
<ngt-line-basic-material color="#ffff00" [toneMapped]="false" />
|
|
174
|
-
</ngts-edges>
|
|
175
|
-
}
|
|
176
|
-
</ngt-mesh>
|
|
177
|
-
</ngt-group>
|
|
178
|
-
`,
|
|
179
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
180
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
181
|
-
imports: [NgtsEdges],
|
|
182
|
-
}]
|
|
183
|
-
}], ctorParameters: () => [] });
|
|
184
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F1c3RpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvc3RhZ2luZy9zcmMvbGliL2NhdXN0aWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixzQkFBc0IsRUFDdEIsTUFBTSxFQUVOLEtBQUssRUFDTCxTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQVksSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFDTixZQUFZLEVBRVosY0FBYyxFQUNkLFNBQVMsRUFDVCxLQUFLLEVBQ0wsWUFBWSxFQUNaLHdCQUF3QixFQUN4QixpQkFBaUIsRUFDakIsSUFBSSxFQUVKLFNBQVMsRUFDVCxrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLEtBQUssRUFDTCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLE9BQU8sR0FDUCxNQUFNLE9BQU8sQ0FBQzs7QUFFZixNQUFNLGNBQWMsR0FBRztJQUN0QixLQUFLLEVBQUUsSUFBSTtJQUNYLFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLElBQUksRUFBRSxnQkFBZ0I7Q0FDdEIsQ0FBQztBQUVGLE1BQU0sZUFBZSxHQUFHO0lBQ3ZCLFNBQVMsRUFBRSx3QkFBd0I7SUFDbkMsU0FB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VDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDakMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQztpQkFDcEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcblx0Q29tcG9uZW50LFxuXHRjb21wdXRlZCxcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0ZWZmZWN0LFxuXHRFbGVtZW50UmVmLFxuXHRpbnB1dCxcblx0dmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGV4dGVuZCwgZ2V0TG9jYWxTdGF0ZSwgaW5qZWN0QmVmb3JlUmVuZGVyLCBOZ3RHcm91cCwgb21pdCwgcGljaywgcmVzb2x2ZVJlZiB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgaW5qZWN0SGVscGVyLCBOZ3RzRWRnZXMgfSBmcm9tICdhbmd1bGFyLXRocmVlLXNvYmEvYWJzdHJhY3Rpb25zJztcbmltcG9ydCB7IGluamVjdEZCTyB9IGZyb20gJ2FuZ3VsYXItdGhyZWUtc29iYS9taXNjJztcbmltcG9ydCB7IENhdXN0aWNzUHJvamVjdGlvbk1hdGVyaWFsLCBjcmVhdGVDYXVzdGljc1VwZGF0ZSB9IGZyb20gJ2FuZ3VsYXItdGhyZWUtc29iYS92YW5pbGxhLWV4cG9ydHMnO1xuaW1wb3J0IHsgbWVyZ2VJbnB1dHMgfSBmcm9tICduZ3h0ZW5zaW9uL2luamVjdC1pbnB1dHMnO1xuaW1wb3J0IHtcblx0Q2FtZXJhSGVscGVyLFxuXHRDb2xvclJlcHJlc2VudGF0aW9uLFxuXHRDdXN0b21CbGVuZGluZyxcblx0RmxvYXRUeXBlLFxuXHRHcm91cCxcblx0TGluZWFyRmlsdGVyLFxuXHRMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIsXG5cdExpbmVCYXNpY01hdGVyaWFsLFxuXHRNZXNoLFxuXHRPYmplY3QzRCxcblx0T25lRmFjdG9yLFxuXHRPcnRob2dyYXBoaWNDYW1lcmEsXG5cdFBsYW5lR2VvbWV0cnksXG5cdFNjZW5lLFxuXHRTcmNBbHBoYUZhY3Rvcixcblx0VW5zaWduZWRCeXRlVHlwZSxcblx0VmVjdG9yMyxcbn0gZnJvbSAndGhyZWUnO1xuXG5jb25zdCBOT1JNQUxfT1BUSU9OUyA9IHtcblx0ZGVwdGg6IHRydWUsXG5cdG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxuXHRtYWdGaWx0ZXI6IExpbmVhckZpbHRlcixcblx0dHlwZTogVW5zaWduZWRCeXRlVHlwZSxcbn07XG5cbmNvbnN0IENBVVNUSUNfT1BUSU9OUyA9IHtcblx0bWluRmlsdGVyOiBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIsXG5cdG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxuXHR0eXBlOiBGbG9hdFR5cGUsXG5cdGdlbmVyYXRlTWlwbWFwczogdHJ1ZSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0c0NhdXN0aWNzT3B0aW9ucyBleHRlbmRzIFBhcnRpYWw8Tmd0R3JvdXA+IHtcblx0LyoqIEhvdyBtYW55IGZyYW1lcyBpdCB3aWxsIHJlbmRlciwgc2V0IGl0IHRvIEluZmluaXR5IGZvciBydW50aW1lLCBkZWZhdWx0OiAxICovXG5cdGZyYW1lczogbnVtYmVyO1xuXHQvKiogRW5hYmxlcyB2aXN1YWwgY3VlcyB0byBoZWxwIHlvdSBzdGFnZSB5b3VyIHNjZW5lLCBkZWZhdWx0OiBmYWxzZSAqL1xuXHRkZWJ1ZzogYm9vbGVhbjtcblx0LyoqIFdpbGwgZGlzcGxheSBjYXVzdGljcyBvbmx5IGFuZCBza2lwIHRoZSBtb2RlbHMsIGRlZmF1bHQ6IGZhbHNlICovXG5cdGNhdXN0aWNzT25seTogYm9vbGVhbjtcblx0LyoqIFdpbGwgaW5jbHVkZSBiYWNrIGZhY2VzIGFuZCBlbmFibGUgdGhlIGJhY2tzaWRlSU9SIHByb3AsIGRlZmF1bHQ6IGZhbHNlICovXG5cdGJhY2tzaWRlOiBib29sZWFuO1xuXHQvKiogVGhlIElPUiByZWZyYWN0aW9uIGluZGV4LCBkZWZhdWx0OiAxLjEgKi9cblx0aW9yOiBudW1iZXI7XG5cdC8qKiBUaGUgSU9SIHJlZnJhY3Rpb24gaW5kZXggZm9yIGJhY2sgZmFjZXMgKG9ubHkgYXZhaWxhYmxlIHdoZW4gYmFja3NpZGUgaXMgZW5hYmxlZCksIGRlZmF1bHQ6IDEuMSAqL1xuXHRiYWNrc2lkZUlPUjogbnVtYmVyO1xuXHQvKiogVGhlIHRleGVsIHNpemUsIGRlZmF1bHQ6IDAuMzEyNSAqL1xuXHR3b3JsZFJhZGl1czogbnVtYmVyO1xuXHQvKiogSW50ZW5zaXR5IG9mIHRoZSBwcmplY3RlZCBjYXVzdGljcywgZGVmYXVsdDogMC4wNSAqL1xuXHRpbnRlbnNpdHk6IG51bWJlcjtcblx0LyoqIENhdXN0aWNzIGNvbG9yLCBkZWZhdWx0OiB3aGl0ZSAqL1xuXHRjb2xvcjogQ29sb3JSZXByZXNlbnRhdGlvbjtcblx0LyoqIEJ1ZmZlciByZXNvbHV0aW9uLCBkZWZhdWx0OiAyMDQ4ICovXG5cdHJlc29sdXRpb246IG51bWJlcjtcblx0LyoqIENhbWVyYSBwb3NpdGlvbiwgaXQgd2lsbCBwb2ludCB0b3dhcmRzIHRoZSBjb250ZW50cyBib3VuZHMgY2VudGVyLCBkZWZhdWx0OiBbNSwgNSwgNV0gKi9cblx0bGlnaHRTb3VyY2U6IFt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyXSB8IEVsZW1lbnRSZWY8T2JqZWN0M0Q+IHwgT2JqZWN0M0Q7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBOZ3RzQ2F1c3RpY3NPcHRpb25zID0ge1xuXHRmcmFtZXM6IDEsXG5cdGRlYnVnOiBmYWxzZSxcblx0Y2F1c3RpY3NPbmx5OiBmYWxzZSxcblx0YmFja3NpZGU6IGZhbHNlLFxuXHRpb3I6IDEuMSxcblx0YmFja3NpZGVJT1I6IDEuMSxcblx0d29ybGRSYWRpdXM6IDAuMzEyNSxcblx0aW50ZW5zaXR5OiAwLjA1LFxuXHRjb2xvcjogJ3doaXRlJyxcblx0cmVzb2x1dGlvbjogMjAyNCxcblx0bGlnaHRTb3VyY2U6IFs1LCA1LCA1XSxcbn07XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHMtY2F1c3RpY3MnLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZ3QtZ3JvdXAgI2dyb3VwIFtwYXJhbWV0ZXJzXT1cInBhcmFtZXRlcnMoKVwiPlxuXHRcdFx0PG5ndC1zY2VuZSAjc2NlbmU+XG5cdFx0XHRcdDxuZ3Qtb3J0aG9ncmFwaGljLWNhbWVyYSAjY2FtZXJhIFt1cF09XCJbMCwgMSwgMF1cIiAvPlxuXHRcdFx0XHQ8bmctY29udGVudCAvPlxuXHRcdFx0PC9uZ3Qtc2NlbmU+XG5cblx0XHRcdDxuZ3QtbWVzaCAjcGxhbmUgW3JlbmRlck9yZGVyXT1cIjJcIiBbcm90YXRpb25dPVwiWy1NYXRoLlBJIC8gMiwgMCwgMF1cIj5cblx0XHRcdFx0PG5ndC1wbGFuZS1nZW9tZXRyeSAvPlxuXHRcdFx0XHQ8bmd0LWNhdXN0aWNzLXByb2plY3Rpb24tbWF0ZXJpYWxcblx0XHRcdFx0XHRbdHJhbnNwYXJlbnRdPVwidHJ1ZVwiXG5cdFx0XHRcdFx0W2NvbG9yXT1cImNvbG9yKClcIlxuXHRcdFx0XHRcdFtjYXVzdGljc1RleHR1cmVdPVwiY2F1c3RpY3NUYXJnZXQoKS50ZXh0dXJlXCJcblx0XHRcdFx0XHRbY2F1c3RpY3NUZXh0dXJlQl09XCJjYXVzdGljc1RhcmdldEIoKS50ZXh0dXJlXCJcblx0XHRcdFx0XHRbYmxlbmRpbmddPVwiQ3VzdG9tQmxlbmRpbmdcIlxuXHRcdFx0XHRcdFtibGVuZFNyY109XCJPbmVGYWN0b3JcIlxuXHRcdFx0XHRcdFtibGVuZERzdF09XCJTcmNBbHBoYUZhY3RvclwiXG5cdFx0XHRcdFx0W2RlcHRoV3JpdGVdPVwiZmFsc2VcIlxuXHRcdFx0XHQvPlxuXG5cdFx0XHRcdEBpZiAoZGVidWcoKSkge1xuXHRcdFx0XHRcdDxuZ3RzLWVkZ2VzPlxuXHRcdFx0XHRcdFx0PG5ndC1saW5lLWJhc2ljLW1hdGVyaWFsIGNvbG9yPVwiI2ZmZmYwMFwiIFt0b25lTWFwcGVkXT1cImZhbHNlXCIgLz5cblx0XHRcdFx0XHQ8L25ndHMtZWRnZXM+XG5cdFx0XHRcdH1cblx0XHRcdDwvbmd0LW1lc2g+XG5cdFx0PC9uZ3QtZ3JvdXA+XG5cdGAsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG5cdGltcG9ydHM6IFtOZ3RzRWRnZXNdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzQ2F1c3RpY3Mge1xuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgTWF0aCA9IE1hdGg7XG5cdHByb3RlY3RlZCByZWFkb25seSBDdXN0b21CbGVuZGluZyA9IEN1c3RvbUJsZW5kaW5nO1xuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgT25lRmFjdG9yID0gT25lRmFjdG9yO1xuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgU3JjQWxwaGFGYWN0b3IgPSBTcmNBbHBoYUZhY3RvcjtcblxuXHRvcHRpb25zID0gaW5wdXQoZGVmYXVsdE9wdGlvbnMsIHsgdHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0T3B0aW9ucykgfSk7XG5cdHBhcmFtZXRlcnMgPSBvbWl0KHRoaXMub3B0aW9ucywgW1xuXHRcdCdmcmFtZXMnLFxuXHRcdCdkZWJ1ZycsXG5cdFx0J2NhdXN0aWNzT25seScsXG5cdFx0J2JhY2tzaWRlJyxcblx0XHQnaW9yJyxcblx0XHQnYmFja3NpZGVJT1InLFxuXHRcdCd3b3JsZFJhZGl1cycsXG5cdFx0J2ludGVuc2l0eScsXG5cdFx0J2NvbG9yJyxcblx0XHQncmVzb2x1dGlvbicsXG5cdFx0J2xpZ2h0U291cmNlJyxcblx0XSk7XG5cblx0ZGVidWcgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2RlYnVnJyk7XG5cdGNvbG9yID0gcGljayh0aGlzLm9wdGlvbnMsICdjb2xvcicpO1xuXHRwcml2YXRlIHJlc29sdXRpb24gPSBwaWNrKHRoaXMub3B0aW9ucywgJ3Jlc29sdXRpb24nKTtcblxuXHRncm91cFJlZiA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEdyb3VwPj4oJ2dyb3VwJyk7XG5cdHByaXZhdGUgc2NlbmVSZWYgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxTY2VuZT4+KCdzY2VuZScpO1xuXHRwcml2YXRlIGNhbWVyYVJlZiA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPE9ydGhvZ3JhcGhpY0NhbWVyYT4+KCdjYW1lcmEnKTtcblx0cHJpdmF0ZSBwbGFuZVJlZiA9XG5cdFx0dmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8TWVzaDxQbGFuZUdlb21ldHJ5LCBJbnN0YW5jZVR5cGU8dHlwZW9mIENhdXN0aWNzUHJvamVjdGlvbk1hdGVyaWFsPj4+PigncGxhbmUnKTtcblxuXHRwcml2YXRlIG5vcm1hbFRhcmdldFBhcmFtcyA9IGNvbXB1dGVkKCgpID0+ICh7XG5cdFx0d2lkdGg6IHRoaXMucmVzb2x1dGlvbigpLFxuXHRcdGhlaWdodDogdGhpcy5yZXNvbHV0aW9uKCksXG5cdFx0c2V0dGluZ3M6IE5PUk1BTF9PUFRJT05TLFxuXHR9KSk7XG5cblx0Ly8gQnVmZmVycyBmb3IgZnJvbnQgYW5kIGJhY2sgZmFjZXNcblx0cHJpdmF0ZSBub3JtYWxUYXJnZXQgPSBpbmplY3RGQk8odGhpcy5ub3JtYWxUYXJnZXRQYXJhbXMpO1xuXHRwcml2YXRlIG5vcm1hbFRhcmdldEIgPSBpbmplY3RGQk8odGhpcy5ub3JtYWxUYXJnZXRQYXJhbXMpO1xuXG5cdHByaXZhdGUgY2F1c3RpY3NUYXJnZXRQYXJhbXMgPSBjb21wdXRlZCgoKSA9PiAoe1xuXHRcdHdpZHRoOiB0aGlzLnJlc29sdXRpb24oKSxcblx0XHRoZWlnaHQ6IHRoaXMucmVzb2x1dGlvbigpLFxuXHRcdHNldHRpbmdzOiBDQVVTVElDX09QVElPTlMsXG5cdH0pKTtcblx0Y2F1c3RpY3NUYXJnZXQgPSBpbmplY3RGQk8odGhpcy5jYXVzdGljc1RhcmdldFBhcmFtcyk7XG5cdGNhdXN0aWNzVGFyZ2V0QiA9IGluamVjdEZCTyh0aGlzLmNhdXN0aWNzVGFyZ2V0UGFyYW1zKTtcblxuXHRwcml2YXRlIGNhbWVyYUhlbHBlciA9IGluamVjdEhlbHBlcihcblx0XHQoKSA9PiAodGhpcy5kZWJ1ZygpID8gdGhpcy5jYW1lcmFSZWYoKS5uYXRpdmVFbGVtZW50IDogbnVsbCksXG5cdFx0KCkgPT4gQ2FtZXJhSGVscGVyLFxuXHQpO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGV4dGVuZCh7IENhdXN0aWNzUHJvamVjdGlvbk1hdGVyaWFsLCBHcm91cCwgU2NlbmUsIE1lc2gsIFBsYW5lR2VvbWV0cnksIExpbmVCYXNpY01hdGVyaWFsLCBPcnRob2dyYXBoaWNDYW1lcmEgfSk7XG5cblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0Ly8gdHJhY2sgYWxsIGNoYW5nZXNcblx0XHRcdGNvbnN0IFtncm91cCwgc2NlbmUsIHBsYW5lXSA9IFtcblx0XHRcdFx0dGhpcy5ncm91cFJlZigpLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHRcdHRoaXMuc2NlbmVSZWYoKS5uYXRpdmVFbGVtZW50LFxuXHRcdFx0XHR0aGlzLnBsYW5lUmVmKCkubmF0aXZlRWxlbWVudCxcblx0XHRcdFx0dGhpcy5vcHRpb25zKCksXG5cdFx0XHRdO1xuXHRcdFx0Y29uc3QgZ3JvdXBMb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShncm91cCk7XG5cdFx0XHRjb25zdCBzY2VuZUxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKHNjZW5lKTtcblx0XHRcdGNvbnN0IHBsYW5lTG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUocGxhbmUpO1xuXG5cdFx0XHRpZiAoIWdyb3VwTG9jYWxTdGF0ZSB8fCAhc2NlbmVMb2NhbFN0YXRlIHx8ICFwbGFuZUxvY2FsU3RhdGUpIHJldHVybjtcblxuXHRcdFx0Z3JvdXBMb2NhbFN0YXRlLm9iamVjdHMoKTtcblx0XHRcdHNjZW5lTG9jYWxTdGF0ZS5vYmplY3RzKCk7XG5cdFx0XHRwbGFuZUxvY2FsU3RhdGUub2JqZWN0cygpO1xuXHRcdFx0cGxhbmVMb2NhbFN0YXRlLm5vbk9iamVjdHMoKTtcblxuXHRcdFx0Z3JvdXAudXBkYXRlV29ybGRNYXRyaXgoZmFsc2UsIHRydWUpO1xuXHRcdH0pO1xuXG5cdFx0Y29uc3QgdXBkYXRlID0gY3JlYXRlQ2F1c3RpY3NVcGRhdGUoKCkgPT4ge1xuXHRcdFx0Y29uc3QgeyBsaWdodFNvdXJjZSwgLi4ucmVzdCB9ID0gdGhpcy5vcHRpb25zKCk7XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHBhcmFtczogT2JqZWN0LmFzc2lnbihyZXN0LCB7XG5cdFx0XHRcdFx0bGlnaHRTb3VyY2U6IEFycmF5LmlzQXJyYXkobGlnaHRTb3VyY2UpID8gbmV3IFZlY3RvcjMoLi4ubGlnaHRTb3VyY2UpIDogcmVzb2x2ZVJlZihsaWdodFNvdXJjZSksXG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRub3JtYWxUYXJnZXQ6IHRoaXMubm9ybWFsVGFyZ2V0KCksXG5cdFx0XHRcdG5vcm1hbFRhcmdldEI6IHRoaXMubm9ybWFsVGFyZ2V0QigpLFxuXHRcdFx0XHRjYXVzdGljc1RhcmdldDogdGhpcy5jYXVzdGljc1RhcmdldCgpLFxuXHRcdFx0XHRjYXVzdGljc1RhcmdldEI6IHRoaXMuY2F1c3RpY3NUYXJnZXRCKCksXG5cdFx0XHRcdGNhbWVyYTogdGhpcy5jYW1lcmFSZWYoKS5uYXRpdmVFbGVtZW50LFxuXHRcdFx0XHRzY2VuZTogdGhpcy5zY2VuZVJlZigpLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHRcdGdyb3VwOiB0aGlzLmdyb3VwUmVmKCkubmF0aXZlRWxlbWVudCxcblx0XHRcdFx0cGxhbmU6IHRoaXMucGxhbmVSZWYoKS5uYXRpdmVFbGVtZW50LFxuXHRcdFx0XHRoZWxwZXI6IHRoaXMuY2FtZXJhSGVscGVyKCksXG5cdFx0XHR9O1xuXHRcdH0pO1xuXG5cdFx0aW5qZWN0QmVmb3JlUmVuZGVyKCh7IGdsIH0pID0+IHVwZGF0ZShnbCkpO1xuXHR9XG59XG4iXX0=
|