angular-three 2.14.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/fesm2022/angular-three-nativescript.mjs +3 -3
- package/fesm2022/angular-three-nativescript.mjs.map +1 -1
- package/fesm2022/angular-three-testing.mjs +12 -14
- package/fesm2022/angular-three-testing.mjs.map +1 -1
- package/fesm2022/angular-three.mjs +116 -100
- package/fesm2022/angular-three.mjs.map +1 -1
- package/lib/canvas.d.ts +31 -31
- package/lib/html.d.ts +3 -3
- package/lib/portal.d.ts +2 -2
- package/lib/routed-scene.d.ts +8 -2
- package/lib/utils/object-events.d.ts +0 -19
- package/nativescript/lib/canvas.d.ts +3 -3
- package/package.json +3 -9
- package/plugin/src/generators/init/schema.json +8 -8
- package/esm2022/angular-three.mjs +0 -5
- package/esm2022/index.mjs +0 -25
- package/esm2022/lib/canvas.mjs +0 -188
- package/esm2022/lib/directives/args.mjs +0 -53
- package/esm2022/lib/directives/selection.mjs +0 -69
- package/esm2022/lib/dom/events.mjs +0 -73
- package/esm2022/lib/events.mjs +0 -361
- package/esm2022/lib/html.mjs +0 -44
- package/esm2022/lib/instance.mjs +0 -83
- package/esm2022/lib/loader.mjs +0 -93
- package/esm2022/lib/loop.mjs +0 -141
- package/esm2022/lib/pipes/hexify.mjs +0 -86
- package/esm2022/lib/portal.mjs +0 -220
- package/esm2022/lib/renderer/catalogue.mjs +0 -7
- package/esm2022/lib/renderer/constants.mjs +0 -23
- package/esm2022/lib/renderer/index.mjs +0 -544
- package/esm2022/lib/renderer/state.mjs +0 -54
- package/esm2022/lib/renderer/utils.mjs +0 -223
- package/esm2022/lib/roots.mjs +0 -274
- package/esm2022/lib/routed-scene.mjs +0 -33
- package/esm2022/lib/store.mjs +0 -179
- package/esm2022/lib/three-types.mjs +0 -2
- package/esm2022/lib/types.mjs +0 -2
- package/esm2022/lib/utils/apply-props.mjs +0 -130
- package/esm2022/lib/utils/attach.mjs +0 -46
- package/esm2022/lib/utils/before-render.mjs +0 -41
- package/esm2022/lib/utils/is.mjs +0 -52
- package/esm2022/lib/utils/make.mjs +0 -52
- package/esm2022/lib/utils/object-events.mjs +0 -137
- package/esm2022/lib/utils/output-ref.mjs +0 -9
- package/esm2022/lib/utils/parameters.mjs +0 -70
- package/esm2022/lib/utils/resolve-ref.mjs +0 -8
- package/esm2022/lib/utils/signal-store.mjs +0 -90
- package/esm2022/lib/utils/update.mjs +0 -37
- package/esm2022/nativescript/angular-three-nativescript.mjs +0 -5
- package/esm2022/nativescript/index.mjs +0 -2
- package/esm2022/nativescript/lib/canvas.mjs +0 -127
- package/esm2022/testing/angular-three-testing.mjs +0 -5
- package/esm2022/testing/index.mjs +0 -3
- package/esm2022/testing/lib/test-bed.mjs +0 -130
- package/esm2022/testing/lib/test-canvas.mjs +0 -45
- package/esm2022/testing/lib/utils/mock-canvas.mjs +0 -37
- package/esm2022/testing/lib/utils/web-gl-rendering-context.mjs +0 -752
package/lib/canvas.d.ts
CHANGED
|
@@ -24,12 +24,15 @@ export declare class NgtCanvas {
|
|
|
24
24
|
dpr: import("@angular/core").InputSignal<NgtDpr>;
|
|
25
25
|
raycaster: import("@angular/core").InputSignal<Partial<Raycaster> | undefined>;
|
|
26
26
|
scene: import("@angular/core").InputSignal<Scene | Partial<Scene> | undefined>;
|
|
27
|
-
camera: import("@angular/core").InputSignal<NonNullable<((import("
|
|
27
|
+
camera: import("@angular/core").InputSignal<NonNullable<((import("angular-three").NgtCamera | Partial<{
|
|
28
|
+
parent?: import("three").Object3D<import("three").Object3DEventMap> | null | undefined;
|
|
29
|
+
add?: ((...object: import("three").Object3D[]) => import("three").Camera) | undefined;
|
|
30
|
+
remove?: ((...object: import("three").Object3D[]) => import("three").Camera) | undefined;
|
|
31
|
+
attach: string | string[] | import("angular-three").NgtAttachFunction;
|
|
28
32
|
readonly type?: string | undefined;
|
|
29
33
|
viewport?: import("three").Vector4 | undefined;
|
|
30
34
|
addEventListener: (<TEventKey extends keyof import("angular-three").NgtNodeEventMap<import("three").Camera>>(type: TEventKey, listener: (this: import("angular-three").NgtNodeElement<import("three").Camera, typeof import("three").Camera>, ev: import("angular-three").NgtNodeEventMap<import("three").Camera>[TEventKey]) => any) => void) & (<TEventKey extends keyof import("angular-three").NgtAllObject3DEventsMap>(type: TEventKey, listener: (this: any, ev: import("angular-three").NgtAllObject3DEventsMap[TEventKey]) => any) => void);
|
|
31
35
|
removeEventListener: (<TEventKey extends keyof import("angular-three").NgtNodeEventMap<import("three").Camera>>(type: TEventKey, listener: (this: import("angular-three").NgtNodeElement<import("three").Camera, typeof import("three").Camera>, ev: import("angular-three").NgtNodeEventMap<import("three").Camera>[TEventKey]) => any) => void) & (<TEventKey extends keyof import("angular-three").NgtAllObject3DEventsMap>(type: TEventKey, listener: (this: any, ev: import("angular-three").NgtAllObject3DEventsMap[TEventKey]) => any) => void);
|
|
32
|
-
attach: string | string[] | import("./types").NgtAttachFunction;
|
|
33
36
|
__ngt_args__: [];
|
|
34
37
|
readonly isCamera?: true | undefined;
|
|
35
38
|
matrixWorldInverse?: import("three").Matrix4 | undefined;
|
|
@@ -41,7 +44,6 @@ export declare class NgtCanvas {
|
|
|
41
44
|
readonly id?: number | undefined;
|
|
42
45
|
uuid?: string | undefined;
|
|
43
46
|
name?: string | undefined;
|
|
44
|
-
parent?: import("three").Object3D<import("three").Object3DEventMap> | null | undefined;
|
|
45
47
|
children?: import("three").Object3D<import("three").Object3DEventMap>[] | undefined;
|
|
46
48
|
readonly modelViewMatrix?: import("three").Matrix4 | undefined;
|
|
47
49
|
readonly normalMatrix?: import("three").Matrix3 | undefined;
|
|
@@ -83,8 +85,6 @@ export declare class NgtCanvas {
|
|
|
83
85
|
(vector: Vector3): void;
|
|
84
86
|
(x: number, y: number, z: number): void;
|
|
85
87
|
} | undefined;
|
|
86
|
-
add?: ((...object: import("three").Object3D[]) => import("three").Camera) | undefined;
|
|
87
|
-
remove?: ((...object: import("three").Object3D[]) => import("three").Camera) | undefined;
|
|
88
88
|
removeFromParent?: (() => import("three").Camera) | undefined;
|
|
89
89
|
clear?: (() => import("three").Camera) | undefined;
|
|
90
90
|
getObjectById?: ((id: number) => import("three").Object3D | undefined) | undefined;
|
|
@@ -115,20 +115,14 @@ export declare class NgtCanvas {
|
|
|
115
115
|
dispose: (() => void) | null;
|
|
116
116
|
raycast: import("three").Object3D["raycast"] | null;
|
|
117
117
|
} & {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
offsetX: number;
|
|
123
|
-
offsetY: number;
|
|
124
|
-
width: number;
|
|
125
|
-
height: number;
|
|
126
|
-
} | null | undefined;
|
|
118
|
+
parent?: import("three").Object3D<import("three").Object3DEventMap> | null | undefined;
|
|
119
|
+
add?: ((...object: import("three").Object3D[]) => import("three").PerspectiveCamera) | undefined;
|
|
120
|
+
remove?: ((...object: import("three").Object3D[]) => import("three").PerspectiveCamera) | undefined;
|
|
121
|
+
attach: string | string[] | import("angular-three").NgtAttachFunction;
|
|
127
122
|
readonly type?: string | undefined;
|
|
128
123
|
viewport?: import("three").Vector4 | undefined;
|
|
129
124
|
addEventListener: (<TEventKey extends keyof import("angular-three").NgtNodeEventMap<import("three").PerspectiveCamera>>(type: TEventKey, listener: (this: import("angular-three").NgtNodeElement<import("three").PerspectiveCamera, typeof import("three").PerspectiveCamera>, ev: import("angular-three").NgtNodeEventMap<import("three").PerspectiveCamera>[TEventKey]) => any) => void) & (<TEventKey extends keyof import("angular-three").NgtAllObject3DEventsMap>(type: TEventKey, listener: (this: any, ev: import("angular-three").NgtAllObject3DEventsMap[TEventKey]) => any) => void);
|
|
130
125
|
removeEventListener: (<TEventKey extends keyof import("angular-three").NgtNodeEventMap<import("three").PerspectiveCamera>>(type: TEventKey, listener: (this: import("angular-three").NgtNodeElement<import("three").PerspectiveCamera, typeof import("three").PerspectiveCamera>, ev: import("angular-three").NgtNodeEventMap<import("three").PerspectiveCamera>[TEventKey]) => any) => void) & (<TEventKey extends keyof import("angular-three").NgtAllObject3DEventsMap>(type: TEventKey, listener: (this: any, ev: import("angular-three").NgtAllObject3DEventsMap[TEventKey]) => any) => void);
|
|
131
|
-
attach: string | string[] | import("./types").NgtAttachFunction;
|
|
132
126
|
__ngt_args__: [fov?: number | undefined, aspect?: number | undefined, near?: number | undefined, far?: number | undefined];
|
|
133
127
|
readonly isCamera?: true | undefined;
|
|
134
128
|
matrixWorldInverse?: import("three").Matrix4 | undefined;
|
|
@@ -140,7 +134,6 @@ export declare class NgtCanvas {
|
|
|
140
134
|
readonly id?: number | undefined;
|
|
141
135
|
uuid?: string | undefined;
|
|
142
136
|
name?: string | undefined;
|
|
143
|
-
parent?: import("three").Object3D<import("three").Object3DEventMap> | null | undefined;
|
|
144
137
|
children?: import("three").Object3D<import("three").Object3DEventMap>[] | undefined;
|
|
145
138
|
readonly modelViewMatrix?: import("three").Matrix4 | undefined;
|
|
146
139
|
readonly normalMatrix?: import("three").Matrix3 | undefined;
|
|
@@ -182,8 +175,6 @@ export declare class NgtCanvas {
|
|
|
182
175
|
(vector: Vector3): void;
|
|
183
176
|
(x: number, y: number, z: number): void;
|
|
184
177
|
} | undefined;
|
|
185
|
-
add?: ((...object: import("three").Object3D[]) => import("three").PerspectiveCamera) | undefined;
|
|
186
|
-
remove?: ((...object: import("three").Object3D[]) => import("three").PerspectiveCamera) | undefined;
|
|
187
178
|
removeFromParent?: (() => import("three").PerspectiveCamera) | undefined;
|
|
188
179
|
clear?: (() => import("three").PerspectiveCamera) | undefined;
|
|
189
180
|
getObjectById?: ((id: number) => import("three").Object3D | undefined) | undefined;
|
|
@@ -211,6 +202,15 @@ export declare class NgtCanvas {
|
|
|
211
202
|
near?: number | undefined;
|
|
212
203
|
far?: number | undefined;
|
|
213
204
|
focus?: number | undefined;
|
|
205
|
+
view?: {
|
|
206
|
+
enabled: boolean;
|
|
207
|
+
fullWidth: number;
|
|
208
|
+
fullHeight: number;
|
|
209
|
+
offsetX: number;
|
|
210
|
+
offsetY: number;
|
|
211
|
+
width: number;
|
|
212
|
+
height: number;
|
|
213
|
+
} | null | undefined;
|
|
214
214
|
filmGauge?: number | undefined;
|
|
215
215
|
filmOffset?: number | undefined;
|
|
216
216
|
getFocalLength?: (() => number) | undefined;
|
|
@@ -234,20 +234,14 @@ export declare class NgtCanvas {
|
|
|
234
234
|
dispose: (() => void) | null;
|
|
235
235
|
raycast: import("three").Object3D["raycast"] | null;
|
|
236
236
|
} & {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
offsetX: number;
|
|
242
|
-
offsetY: number;
|
|
243
|
-
width: number;
|
|
244
|
-
height: number;
|
|
245
|
-
} | null | undefined;
|
|
237
|
+
parent?: import("three").Object3D<import("three").Object3DEventMap> | null | undefined;
|
|
238
|
+
add?: ((...object: import("three").Object3D[]) => import("three").OrthographicCamera) | undefined;
|
|
239
|
+
remove?: ((...object: import("three").Object3D[]) => import("three").OrthographicCamera) | undefined;
|
|
240
|
+
attach: string | string[] | import("angular-three").NgtAttachFunction;
|
|
246
241
|
readonly type?: string | undefined;
|
|
247
242
|
viewport?: import("three").Vector4 | undefined;
|
|
248
243
|
addEventListener: (<TEventKey extends keyof import("angular-three").NgtNodeEventMap<import("three").OrthographicCamera>>(type: TEventKey, listener: (this: import("angular-three").NgtNodeElement<import("three").OrthographicCamera, typeof import("three").OrthographicCamera>, ev: import("angular-three").NgtNodeEventMap<import("three").OrthographicCamera>[TEventKey]) => any) => void) & (<TEventKey extends keyof import("angular-three").NgtAllObject3DEventsMap>(type: TEventKey, listener: (this: any, ev: import("angular-three").NgtAllObject3DEventsMap[TEventKey]) => any) => void);
|
|
249
244
|
removeEventListener: (<TEventKey extends keyof import("angular-three").NgtNodeEventMap<import("three").OrthographicCamera>>(type: TEventKey, listener: (this: import("angular-three").NgtNodeElement<import("three").OrthographicCamera, typeof import("three").OrthographicCamera>, ev: import("angular-three").NgtNodeEventMap<import("three").OrthographicCamera>[TEventKey]) => any) => void) & (<TEventKey extends keyof import("angular-three").NgtAllObject3DEventsMap>(type: TEventKey, listener: (this: any, ev: import("angular-three").NgtAllObject3DEventsMap[TEventKey]) => any) => void);
|
|
250
|
-
attach: string | string[] | import("./types").NgtAttachFunction;
|
|
251
245
|
__ngt_args__: [left?: number | undefined, right?: number | undefined, top?: number | undefined, bottom?: number | undefined, near?: number | undefined, far?: number | undefined];
|
|
252
246
|
readonly isCamera?: true | undefined;
|
|
253
247
|
matrixWorldInverse?: import("three").Matrix4 | undefined;
|
|
@@ -259,7 +253,6 @@ export declare class NgtCanvas {
|
|
|
259
253
|
readonly id?: number | undefined;
|
|
260
254
|
uuid?: string | undefined;
|
|
261
255
|
name?: string | undefined;
|
|
262
|
-
parent?: import("three").Object3D<import("three").Object3DEventMap> | null | undefined;
|
|
263
256
|
children?: import("three").Object3D<import("three").Object3DEventMap>[] | undefined;
|
|
264
257
|
readonly modelViewMatrix?: import("three").Matrix4 | undefined;
|
|
265
258
|
readonly normalMatrix?: import("three").Matrix3 | undefined;
|
|
@@ -301,8 +294,6 @@ export declare class NgtCanvas {
|
|
|
301
294
|
(vector: Vector3): void;
|
|
302
295
|
(x: number, y: number, z: number): void;
|
|
303
296
|
} | undefined;
|
|
304
|
-
add?: ((...object: import("three").Object3D[]) => import("three").OrthographicCamera) | undefined;
|
|
305
|
-
remove?: ((...object: import("three").Object3D[]) => import("three").OrthographicCamera) | undefined;
|
|
306
297
|
removeFromParent?: (() => import("three").OrthographicCamera) | undefined;
|
|
307
298
|
clear?: (() => import("three").OrthographicCamera) | undefined;
|
|
308
299
|
getObjectById?: ((id: number) => import("three").Object3D | undefined) | undefined;
|
|
@@ -326,6 +317,15 @@ export declare class NgtCanvas {
|
|
|
326
317
|
zoom?: number | undefined;
|
|
327
318
|
near?: number | undefined;
|
|
328
319
|
far?: number | undefined;
|
|
320
|
+
view?: {
|
|
321
|
+
enabled: boolean;
|
|
322
|
+
fullWidth: number;
|
|
323
|
+
fullHeight: number;
|
|
324
|
+
offsetX: number;
|
|
325
|
+
offsetY: number;
|
|
326
|
+
width: number;
|
|
327
|
+
height: number;
|
|
328
|
+
} | null | undefined;
|
|
329
329
|
setViewOffset?: ((fullWidth: number, fullHeight: number, offsetX: number, offsetY: number, width: number, height: number) => void) | undefined;
|
|
330
330
|
clearViewOffset?: (() => void) | undefined;
|
|
331
331
|
updateProjectionMatrix?: (() => void) | undefined;
|
package/lib/html.d.ts
CHANGED
|
@@ -8,11 +8,11 @@ export declare function provideHTMLDomElement<TDeps extends Array<ProviderToken<
|
|
|
8
8
|
}>(deps: TDeps, factory: (...args: TValues) => HTMLElement): Provider;
|
|
9
9
|
export declare abstract class NgtHTML {
|
|
10
10
|
static [HTML]: boolean;
|
|
11
|
-
protected store: import("angular-three").NgtSignalStore<import("
|
|
11
|
+
protected store: import("angular-three").NgtSignalStore<import("angular-three").NgtState>;
|
|
12
12
|
protected destroyRef: DestroyRef;
|
|
13
13
|
protected host: ElementRef<HTMLElement>;
|
|
14
|
-
protected domElement: "gl" |
|
|
14
|
+
protected domElement: HTMLElement | "gl" | null;
|
|
15
15
|
constructor();
|
|
16
16
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgtHTML, never>;
|
|
17
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<NgtHTML, never, never, {}, {}, never, never,
|
|
17
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgtHTML, never, never, {}, {}, never, never, true, never>;
|
|
18
18
|
}
|
package/lib/portal.d.ts
CHANGED
|
@@ -34,7 +34,7 @@ export type NgtPortalInjectableState = Partial<Omit<NgtState, NgtPortalPrivateKe
|
|
|
34
34
|
}>;
|
|
35
35
|
export declare class NgtPortal {
|
|
36
36
|
container: import("@angular/core").InputSignal<Object3D<import("three").Object3DEventMap>>;
|
|
37
|
-
state: import("@angular/core").InputSignal<Partial<Omit<NgtState, "
|
|
37
|
+
state: import("@angular/core").InputSignal<Partial<Omit<NgtState, "events" | "size" | "viewport" | "invalidate" | "advance" | "setEvents" | "setSize" | "setDpr" | "setFrameloop"> & {
|
|
38
38
|
events?: {
|
|
39
39
|
enabled?: boolean;
|
|
40
40
|
priority?: number;
|
|
@@ -54,7 +54,7 @@ export declare class NgtPortal {
|
|
|
54
54
|
private portalStore;
|
|
55
55
|
private parentStore;
|
|
56
56
|
protected parentScene: import("@angular/core").Signal<Scene>;
|
|
57
|
-
protected parentCamera: import("@angular/core").Signal<import("
|
|
57
|
+
protected parentCamera: import("@angular/core").Signal<import("angular-three").NgtCameraManual>;
|
|
58
58
|
private raycaster;
|
|
59
59
|
private pointer;
|
|
60
60
|
private portalRendered;
|
package/lib/routed-scene.d.ts
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
import { ChangeDetectorRef } from '@angular/core';
|
|
2
|
-
import { Router } from '@angular/router';
|
|
1
|
+
import { ChangeDetectorRef, EnvironmentInjector } from '@angular/core';
|
|
2
|
+
import { ActivatedRoute, Router, RouterOutlet } from '@angular/router';
|
|
3
3
|
import { ROUTED_SCENE } from './renderer/constants';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class NgtRouterOutlet extends RouterOutlet {
|
|
6
|
+
private environmentInjector;
|
|
7
|
+
activateWith(activatedRoute: ActivatedRoute, environmentInjector: EnvironmentInjector): void;
|
|
8
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgtRouterOutlet, never>;
|
|
9
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgtRouterOutlet, "ngt-router-outlet", never, {}, {}, never, never, true, never>;
|
|
10
|
+
}
|
|
5
11
|
export declare class NgtRoutedScene {
|
|
6
12
|
static [ROUTED_SCENE]: boolean;
|
|
7
13
|
constructor(router: Router, cdr: ChangeDetectorRef);
|
|
@@ -22,25 +22,6 @@ export declare class NgtObjectEvents {
|
|
|
22
22
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgtObjectEvents, never>;
|
|
23
23
|
static ɵdir: i0.ɵɵDirectiveDeclaration<NgtObjectEvents, "[ngtObjectEvents]", never, { "ngtObjectEvents": { "alias": "ngtObjectEvents"; "required": false; "isSignal": true; }; }, { "click": "click"; "dblclick": "dblclick"; "contextmenu": "contextmenu"; "pointerup": "pointerup"; "pointerdown": "pointerdown"; "pointerover": "pointerover"; "pointerout": "pointerout"; "pointerenter": "pointerenter"; "pointerleave": "pointerleave"; "pointermove": "pointermove"; "pointermissed": "pointermissed"; "pointercancel": "pointercancel"; "wheel": "wheel"; "ngtObjectEvents": "ngtObjectEventsChange"; }, never, never, true, never>;
|
|
24
24
|
}
|
|
25
|
-
/**
|
|
26
|
-
* @deprecated this has never worked. Use `NgtObjectEvents` and explicit value for inputs and outputs instead
|
|
27
|
-
* @since 2.12.0 Will be removed in 3.0.0
|
|
28
|
-
*/
|
|
29
|
-
export declare const NgtObjectEventsInputs: string[];
|
|
30
|
-
/**
|
|
31
|
-
* @deprecated this has never worked. Use `NgtObjectEvents` and explicit value for inputs and outputs instead
|
|
32
|
-
* @since 2.12.0 Will be removed in 3.0.0
|
|
33
|
-
*/
|
|
34
|
-
export declare const NgtObjectEventsOutputs: string[];
|
|
35
|
-
/**
|
|
36
|
-
* @deprecated Use NgtObjectEventsInputs and NgtObjectEventsOutputs instead along with NgtObjectEvents
|
|
37
|
-
* @since 2.6.0 Will be removed in 3.0.0
|
|
38
|
-
*/
|
|
39
|
-
export declare const NgtObjectEventsHostDirective: {
|
|
40
|
-
directive: typeof NgtObjectEvents;
|
|
41
|
-
inputs: string[];
|
|
42
|
-
outputs: string[];
|
|
43
|
-
};
|
|
44
25
|
export declare function injectObjectEvents(target: () => ElementRef<Object3D> | Object3D | null | undefined, events: NgtEventHandlers, { injector }?: {
|
|
45
26
|
injector?: Injector;
|
|
46
27
|
}): (() => void)[];
|
|
@@ -18,6 +18,7 @@ export declare class NgtCanvasNative {
|
|
|
18
18
|
raycaster: import("@angular/core").InputSignal<Partial<Raycaster> | undefined>;
|
|
19
19
|
scene: import("@angular/core").InputSignal<Scene | Partial<Scene> | undefined>;
|
|
20
20
|
camera: import("@angular/core").InputSignal<NonNullable<((import("angular-three").NgtCamera | Partial<{
|
|
21
|
+
name?: string | undefined;
|
|
21
22
|
readonly type?: string | undefined;
|
|
22
23
|
addEventListener: (<TEventKey extends keyof import("angular-three").NgtNodeEventMap<import("three").Camera>>(type: TEventKey, listener: (this: import("angular-three").NgtNodeElement<import("three").Camera, typeof import("three").Camera>, ev: import("angular-three").NgtNodeEventMap<import("three").Camera>[TEventKey]) => any) => void) & (<TEventKey extends keyof import("angular-three").NgtAllObject3DEventsMap>(type: TEventKey, listener: (this: any, ev: import("angular-three").NgtAllObject3DEventsMap[TEventKey]) => any) => void);
|
|
23
24
|
removeEventListener: (<TEventKey extends keyof import("angular-three").NgtNodeEventMap<import("three").Camera>>(type: TEventKey, listener: (this: import("angular-three").NgtNodeElement<import("three").Camera, typeof import("three").Camera>, ev: import("angular-three").NgtNodeEventMap<import("three").Camera>[TEventKey]) => any) => void) & (<TEventKey extends keyof import("angular-three").NgtAllObject3DEventsMap>(type: TEventKey, listener: (this: any, ev: import("angular-three").NgtAllObject3DEventsMap[TEventKey]) => any) => void);
|
|
@@ -33,7 +34,6 @@ export declare class NgtCanvasNative {
|
|
|
33
34
|
readonly isObject3D?: true | undefined;
|
|
34
35
|
readonly id?: number | undefined;
|
|
35
36
|
uuid?: string | undefined;
|
|
36
|
-
name?: string | undefined;
|
|
37
37
|
parent?: import("three").Object3D<import("three").Object3DEventMap> | null | undefined;
|
|
38
38
|
children?: import("three").Object3D<import("three").Object3DEventMap>[] | undefined;
|
|
39
39
|
readonly modelViewMatrix?: import("three").Matrix4 | undefined;
|
|
@@ -108,6 +108,7 @@ export declare class NgtCanvasNative {
|
|
|
108
108
|
dispose: (() => void) | null;
|
|
109
109
|
raycast: import("three").Object3D["raycast"] | null;
|
|
110
110
|
} & {
|
|
111
|
+
name?: string | undefined;
|
|
111
112
|
readonly type?: string | undefined;
|
|
112
113
|
addEventListener: (<TEventKey extends keyof import("angular-three").NgtNodeEventMap<import("three").PerspectiveCamera>>(type: TEventKey, listener: (this: import("angular-three").NgtNodeElement<import("three").PerspectiveCamera, typeof import("three").PerspectiveCamera>, ev: import("angular-three").NgtNodeEventMap<import("three").PerspectiveCamera>[TEventKey]) => any) => void) & (<TEventKey extends keyof import("angular-three").NgtAllObject3DEventsMap>(type: TEventKey, listener: (this: any, ev: import("angular-three").NgtAllObject3DEventsMap[TEventKey]) => any) => void);
|
|
113
114
|
removeEventListener: (<TEventKey extends keyof import("angular-three").NgtNodeEventMap<import("three").PerspectiveCamera>>(type: TEventKey, listener: (this: import("angular-three").NgtNodeElement<import("three").PerspectiveCamera, typeof import("three").PerspectiveCamera>, ev: import("angular-three").NgtNodeEventMap<import("three").PerspectiveCamera>[TEventKey]) => any) => void) & (<TEventKey extends keyof import("angular-three").NgtAllObject3DEventsMap>(type: TEventKey, listener: (this: any, ev: import("angular-three").NgtAllObject3DEventsMap[TEventKey]) => any) => void);
|
|
@@ -123,7 +124,6 @@ export declare class NgtCanvasNative {
|
|
|
123
124
|
readonly isObject3D?: true | undefined;
|
|
124
125
|
readonly id?: number | undefined;
|
|
125
126
|
uuid?: string | undefined;
|
|
126
|
-
name?: string | undefined;
|
|
127
127
|
parent?: import("three").Object3D<import("three").Object3DEventMap> | null | undefined;
|
|
128
128
|
children?: import("three").Object3D<import("three").Object3DEventMap>[] | undefined;
|
|
129
129
|
readonly modelViewMatrix?: import("three").Matrix4 | undefined;
|
|
@@ -227,6 +227,7 @@ export declare class NgtCanvasNative {
|
|
|
227
227
|
dispose: (() => void) | null;
|
|
228
228
|
raycast: import("three").Object3D["raycast"] | null;
|
|
229
229
|
} & {
|
|
230
|
+
name?: string | undefined;
|
|
230
231
|
readonly type?: string | undefined;
|
|
231
232
|
addEventListener: (<TEventKey extends keyof import("angular-three").NgtNodeEventMap<import("three").OrthographicCamera>>(type: TEventKey, listener: (this: import("angular-three").NgtNodeElement<import("three").OrthographicCamera, typeof import("three").OrthographicCamera>, ev: import("angular-three").NgtNodeEventMap<import("three").OrthographicCamera>[TEventKey]) => any) => void) & (<TEventKey extends keyof import("angular-three").NgtAllObject3DEventsMap>(type: TEventKey, listener: (this: any, ev: import("angular-three").NgtAllObject3DEventsMap[TEventKey]) => any) => void);
|
|
232
233
|
removeEventListener: (<TEventKey extends keyof import("angular-three").NgtNodeEventMap<import("three").OrthographicCamera>>(type: TEventKey, listener: (this: import("angular-three").NgtNodeElement<import("three").OrthographicCamera, typeof import("three").OrthographicCamera>, ev: import("angular-three").NgtNodeEventMap<import("three").OrthographicCamera>[TEventKey]) => any) => void) & (<TEventKey extends keyof import("angular-three").NgtAllObject3DEventsMap>(type: TEventKey, listener: (this: any, ev: import("angular-three").NgtAllObject3DEventsMap[TEventKey]) => any) => void);
|
|
@@ -242,7 +243,6 @@ export declare class NgtCanvasNative {
|
|
|
242
243
|
readonly isObject3D?: true | undefined;
|
|
243
244
|
readonly id?: number | undefined;
|
|
244
245
|
uuid?: string | undefined;
|
|
245
|
-
name?: string | undefined;
|
|
246
246
|
parent?: import("three").Object3D<import("three").Object3DEventMap> | null | undefined;
|
|
247
247
|
children?: import("three").Object3D<import("three").Object3DEventMap>[] | undefined;
|
|
248
248
|
readonly modelViewMatrix?: import("three").Matrix4 | undefined;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "angular-three",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
],
|
|
23
23
|
"license": "MIT",
|
|
24
24
|
"peerDependencies": {
|
|
25
|
-
"@angular/common": ">=
|
|
26
|
-
"@angular/core": ">=
|
|
25
|
+
"@angular/common": ">=19.0.0 <20.0.0",
|
|
26
|
+
"@angular/core": ">=19.0.0 <20.0.0",
|
|
27
27
|
"ngxtension": ">=3.0.0",
|
|
28
28
|
"three": ">=0.148.0 <0.172.0",
|
|
29
29
|
"@nativescript/angular": ">=18.0.0 <19.0.0",
|
|
@@ -83,20 +83,14 @@
|
|
|
83
83
|
},
|
|
84
84
|
".": {
|
|
85
85
|
"types": "./index.d.ts",
|
|
86
|
-
"esm2022": "./esm2022/angular-three.mjs",
|
|
87
|
-
"esm": "./esm2022/angular-three.mjs",
|
|
88
86
|
"default": "./fesm2022/angular-three.mjs"
|
|
89
87
|
},
|
|
90
88
|
"./nativescript": {
|
|
91
89
|
"types": "./nativescript/index.d.ts",
|
|
92
|
-
"esm2022": "./esm2022/nativescript/angular-three-nativescript.mjs",
|
|
93
|
-
"esm": "./esm2022/nativescript/angular-three-nativescript.mjs",
|
|
94
90
|
"default": "./fesm2022/angular-three-nativescript.mjs"
|
|
95
91
|
},
|
|
96
92
|
"./testing": {
|
|
97
93
|
"types": "./testing/index.d.ts",
|
|
98
|
-
"esm2022": "./esm2022/testing/angular-three-testing.mjs",
|
|
99
|
-
"esm": "./esm2022/testing/angular-three-testing.mjs",
|
|
100
94
|
"default": "./fesm2022/angular-three-testing.mjs"
|
|
101
95
|
}
|
|
102
96
|
},
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
"cli": "nx",
|
|
3
3
|
"$id": "Init",
|
|
4
4
|
"title": "Init Angular Three",
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"skipGenerateExperience": {
|
|
8
|
+
"type": "boolean",
|
|
9
|
+
"description": "Skip generating Experience component",
|
|
10
|
+
"default": false
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
13
|
}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './index';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10aHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvYW5ndWxhci10aHJlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
|
package/esm2022/index.mjs
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export * from './lib/canvas';
|
|
2
|
-
export * from './lib/directives/args';
|
|
3
|
-
export * from './lib/directives/selection';
|
|
4
|
-
export * from './lib/html';
|
|
5
|
-
export * from './lib/instance';
|
|
6
|
-
export * from './lib/loader';
|
|
7
|
-
export * from './lib/loop';
|
|
8
|
-
export * from './lib/pipes/hexify';
|
|
9
|
-
export * from './lib/portal';
|
|
10
|
-
export * from './lib/renderer';
|
|
11
|
-
export * from './lib/roots';
|
|
12
|
-
export * from './lib/routed-scene';
|
|
13
|
-
export * from './lib/store';
|
|
14
|
-
export * from './lib/utils/apply-props';
|
|
15
|
-
export * from './lib/utils/attach';
|
|
16
|
-
export * from './lib/utils/before-render';
|
|
17
|
-
export * from './lib/utils/is';
|
|
18
|
-
export * from './lib/utils/make';
|
|
19
|
-
export * from './lib/utils/object-events';
|
|
20
|
-
export * from './lib/utils/output-ref';
|
|
21
|
-
export * from './lib/utils/parameters';
|
|
22
|
-
export * from './lib/utils/resolve-ref';
|
|
23
|
-
export * from './lib/utils/signal-store';
|
|
24
|
-
export * from './lib/utils/update';
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL2NhbnZhcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9kaXJlY3RpdmVzL2FyZ3MnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9zZWxlY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvaHRtbCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9pbnN0YW5jZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9sb2FkZXInO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbG9vcCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9waXBlcy9oZXhpZnknO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcG9ydGFsJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3JlbmRlcmVyJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3Jvb3RzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3JvdXRlZC1zY2VuZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zdG9yZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi91dGlscy9hcHBseS1wcm9wcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi91dGlscy9hdHRhY2gnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdXRpbHMvYmVmb3JlLXJlbmRlcic7XG5leHBvcnQgKiBmcm9tICcuL2xpYi91dGlscy9pcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi91dGlscy9tYWtlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3V0aWxzL29iamVjdC1ldmVudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdXRpbHMvb3V0cHV0LXJlZic7XG5leHBvcnQgKiBmcm9tICcuL2xpYi91dGlscy9wYXJhbWV0ZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3V0aWxzL3Jlc29sdmUtcmVmJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3V0aWxzL3NpZ25hbC1zdG9yZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi91dGlscy91cGRhdGUnO1xuXG5leHBvcnQgdHlwZSAqIGZyb20gJy4vbGliL3RocmVlLXR5cGVzJztcbmV4cG9ydCB0eXBlICogZnJvbSAnLi9saWIvdHlwZXMnO1xuIl19
|
package/esm2022/lib/canvas.mjs
DELETED
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import { afterNextRender, booleanAttribute, ChangeDetectionStrategy, Component, computed, createEnvironmentInjector, DestroyRef, effect, ElementRef, EnvironmentInjector, inject, Injector, input, NgZone, output, signal, untracked, viewChild, ViewContainerRef, } from '@angular/core';
|
|
2
|
-
import { outputFromObservable } from '@angular/core/rxjs-interop';
|
|
3
|
-
import { NgxResize, provideResizeOptions } from 'ngxtension/resize';
|
|
4
|
-
import { createPointerEvents } from './dom/events';
|
|
5
|
-
import { provideNgtRenderer } from './renderer';
|
|
6
|
-
import { injectCanvasRootInitializer } from './roots';
|
|
7
|
-
import { NgtRoutedScene } from './routed-scene';
|
|
8
|
-
import { injectStore, provideStore } from './store';
|
|
9
|
-
import { is } from './utils/is';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
export class NgtCanvas {
|
|
12
|
-
constructor() {
|
|
13
|
-
this.store = injectStore();
|
|
14
|
-
this.initRoot = injectCanvasRootInitializer();
|
|
15
|
-
this.host = inject(ElementRef);
|
|
16
|
-
this.zone = inject(NgZone);
|
|
17
|
-
this.environmentInjector = inject(EnvironmentInjector);
|
|
18
|
-
this.injector = inject(Injector);
|
|
19
|
-
this.sceneGraph = input.required({
|
|
20
|
-
transform: (value) => {
|
|
21
|
-
if (value === 'routed') {
|
|
22
|
-
console.warn(`[NGT] 'routed' sceneGraph is not working properly.`);
|
|
23
|
-
return NgtRoutedScene;
|
|
24
|
-
}
|
|
25
|
-
return value;
|
|
26
|
-
},
|
|
27
|
-
});
|
|
28
|
-
this.gl = input();
|
|
29
|
-
this.size = input();
|
|
30
|
-
this.shadows = input(false, {
|
|
31
|
-
transform: (value) => {
|
|
32
|
-
if (value === '')
|
|
33
|
-
return booleanAttribute(value);
|
|
34
|
-
return value;
|
|
35
|
-
},
|
|
36
|
-
});
|
|
37
|
-
this.legacy = input(false, { transform: booleanAttribute });
|
|
38
|
-
this.linear = input(false, { transform: booleanAttribute });
|
|
39
|
-
this.flat = input(false, { transform: booleanAttribute });
|
|
40
|
-
this.orthographic = input(false, { transform: booleanAttribute });
|
|
41
|
-
this.frameloop = input('always');
|
|
42
|
-
this.performance = input();
|
|
43
|
-
this.dpr = input([1, 2]);
|
|
44
|
-
this.raycaster = input();
|
|
45
|
-
this.scene = input();
|
|
46
|
-
this.camera = input();
|
|
47
|
-
this.events = input(createPointerEvents);
|
|
48
|
-
this.eventSource = input();
|
|
49
|
-
this.eventPrefix = input('offset');
|
|
50
|
-
this.lookAt = input();
|
|
51
|
-
this.created = output();
|
|
52
|
-
this.pointerMissed = outputFromObservable(this.store.get('pointerMissed$'));
|
|
53
|
-
this.glCanvas = viewChild.required('glCanvas');
|
|
54
|
-
this.glCanvasViewContainerRef = viewChild.required('glCanvas', { read: ViewContainerRef });
|
|
55
|
-
this.hbPointerEvents = computed(() => (this.eventSource() ? 'none' : 'auto'));
|
|
56
|
-
// NOTE: this signal is updated outside of Zone
|
|
57
|
-
this.resizeResult = signal({}, { equal: Object.is });
|
|
58
|
-
this.configurator = signal(null);
|
|
59
|
-
// NOTE: this means that everything in NgtCanvas will be in afterNextRender.
|
|
60
|
-
// this allows the content of NgtCanvas to use effect instead of afterNextRender
|
|
61
|
-
afterNextRender(() => {
|
|
62
|
-
const canvasElement = this.glCanvas().nativeElement;
|
|
63
|
-
this.zone.runOutsideAngular(() => {
|
|
64
|
-
this.configurator.set(this.initRoot(canvasElement));
|
|
65
|
-
});
|
|
66
|
-
effect(() => {
|
|
67
|
-
const resizeResult = this.resizeResult();
|
|
68
|
-
if (!resizeResult.width || resizeResult.width <= 0 || !resizeResult.height || resizeResult.height <= 0)
|
|
69
|
-
return;
|
|
70
|
-
const configurator = this.configurator();
|
|
71
|
-
if (!configurator)
|
|
72
|
-
return;
|
|
73
|
-
const canvasOptions = {
|
|
74
|
-
gl: this.gl(),
|
|
75
|
-
shadows: this.shadows(),
|
|
76
|
-
legacy: this.legacy(),
|
|
77
|
-
linear: this.linear(),
|
|
78
|
-
flat: this.flat(),
|
|
79
|
-
orthographic: this.orthographic(),
|
|
80
|
-
frameloop: this.frameloop(),
|
|
81
|
-
performance: this.performance(),
|
|
82
|
-
dpr: this.dpr(),
|
|
83
|
-
raycaster: this.raycaster(),
|
|
84
|
-
scene: this.scene(),
|
|
85
|
-
camera: this.camera(),
|
|
86
|
-
events: this.events(),
|
|
87
|
-
eventSource: this.eventSource(),
|
|
88
|
-
eventPrefix: this.eventPrefix(),
|
|
89
|
-
lookAt: this.lookAt(),
|
|
90
|
-
size: resizeResult,
|
|
91
|
-
};
|
|
92
|
-
this.zone.runOutsideAngular(() => {
|
|
93
|
-
configurator.configure(canvasOptions);
|
|
94
|
-
untracked(() => {
|
|
95
|
-
if (this.glRef) {
|
|
96
|
-
this.glRef.changeDetectorRef.detectChanges();
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
this.noZoneRender();
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
});
|
|
103
|
-
}, { injector: this.injector });
|
|
104
|
-
});
|
|
105
|
-
inject(DestroyRef).onDestroy(() => {
|
|
106
|
-
this.glRef?.destroy();
|
|
107
|
-
this.glEnvironmentInjector?.destroy();
|
|
108
|
-
this.configurator()?.destroy();
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
noZoneRender() {
|
|
112
|
-
// NOTE: destroy previous instances if existed
|
|
113
|
-
this.glEnvironmentInjector?.destroy();
|
|
114
|
-
this.glRef?.destroy();
|
|
115
|
-
// NOTE: Flag the canvas active, rendering will now begin
|
|
116
|
-
this.store.update((state) => ({ internal: { ...state.internal, active: true } }));
|
|
117
|
-
const [state, eventSource, eventPrefix] = [
|
|
118
|
-
this.store.snapshot,
|
|
119
|
-
untracked(this.eventSource),
|
|
120
|
-
untracked(this.eventPrefix),
|
|
121
|
-
];
|
|
122
|
-
// connect to event source
|
|
123
|
-
state.events.connect?.(eventSource ? (is.ref(eventSource) ? eventSource.nativeElement : eventSource) : this.host.nativeElement);
|
|
124
|
-
// setup compute for eventPrefix
|
|
125
|
-
if (eventPrefix) {
|
|
126
|
-
state.setEvents({
|
|
127
|
-
compute: (event, store) => {
|
|
128
|
-
const { pointer, raycaster, camera, size } = store.snapshot;
|
|
129
|
-
const x = event[(eventPrefix + 'X')];
|
|
130
|
-
const y = event[(eventPrefix + 'Y')];
|
|
131
|
-
pointer.set((x / size.width) * 2 - 1, -(y / size.height) * 2 + 1);
|
|
132
|
-
raycaster.setFromCamera(pointer, camera);
|
|
133
|
-
},
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
// emit created event if observed
|
|
137
|
-
this.created.emit(this.store.snapshot);
|
|
138
|
-
if (!this.store.get('events', 'connected')) {
|
|
139
|
-
this.store.get('events').connect?.(untracked(this.glCanvas).nativeElement);
|
|
140
|
-
}
|
|
141
|
-
this.glEnvironmentInjector = createEnvironmentInjector([provideNgtRenderer(this.store)], this.environmentInjector);
|
|
142
|
-
this.glRef = untracked(this.glCanvasViewContainerRef).createComponent(untracked(this.sceneGraph), {
|
|
143
|
-
environmentInjector: this.glEnvironmentInjector,
|
|
144
|
-
injector: this.injector,
|
|
145
|
-
});
|
|
146
|
-
this.glRef.changeDetectorRef.detectChanges();
|
|
147
|
-
}
|
|
148
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtCanvas, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
149
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.11", type: NgtCanvas, isStandalone: true, selector: "ngt-canvas", inputs: { sceneGraph: { classPropertyName: "sceneGraph", publicName: "sceneGraph", isSignal: true, isRequired: true, transformFunction: null }, gl: { classPropertyName: "gl", publicName: "gl", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, shadows: { classPropertyName: "shadows", publicName: "shadows", isSignal: true, isRequired: false, transformFunction: null }, legacy: { classPropertyName: "legacy", publicName: "legacy", isSignal: true, isRequired: false, transformFunction: null }, linear: { classPropertyName: "linear", publicName: "linear", isSignal: true, isRequired: false, transformFunction: null }, flat: { classPropertyName: "flat", publicName: "flat", isSignal: true, isRequired: false, transformFunction: null }, orthographic: { classPropertyName: "orthographic", publicName: "orthographic", isSignal: true, isRequired: false, transformFunction: null }, frameloop: { classPropertyName: "frameloop", publicName: "frameloop", isSignal: true, isRequired: false, transformFunction: null }, performance: { classPropertyName: "performance", publicName: "performance", isSignal: true, isRequired: false, transformFunction: null }, dpr: { classPropertyName: "dpr", publicName: "dpr", isSignal: true, isRequired: false, transformFunction: null }, raycaster: { classPropertyName: "raycaster", publicName: "raycaster", isSignal: true, isRequired: false, transformFunction: null }, scene: { classPropertyName: "scene", publicName: "scene", isSignal: true, isRequired: false, transformFunction: null }, camera: { classPropertyName: "camera", publicName: "camera", isSignal: true, isRequired: false, transformFunction: null }, events: { classPropertyName: "events", publicName: "events", isSignal: true, isRequired: false, transformFunction: null }, eventSource: { classPropertyName: "eventSource", publicName: "eventSource", isSignal: true, isRequired: false, transformFunction: null }, eventPrefix: { classPropertyName: "eventPrefix", publicName: "eventPrefix", isSignal: true, isRequired: false, transformFunction: null }, lookAt: { classPropertyName: "lookAt", publicName: "lookAt", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { created: "created", pointerMissed: "pointerMissed" }, host: { properties: { "style.pointerEvents": "hbPointerEvents()" }, styleAttribute: "display: block;position: relative;width: 100%;height: 100%;overflow: hidden;" }, providers: [
|
|
150
|
-
provideResizeOptions({
|
|
151
|
-
emitInZone: false,
|
|
152
|
-
emitInitialResult: true,
|
|
153
|
-
debounce: { scroll: 50, resize: 0 },
|
|
154
|
-
}),
|
|
155
|
-
provideStore(),
|
|
156
|
-
], viewQueries: [{ propertyName: "glCanvas", first: true, predicate: ["glCanvas"], descendants: true, isSignal: true }, { propertyName: "glCanvasViewContainerRef", first: true, predicate: ["glCanvas"], descendants: true, read: ViewContainerRef, isSignal: true }], ngImport: i0, template: `
|
|
157
|
-
<div (ngxResize)="resizeResult.set($event)" style="height: 100%; width: 100%;">
|
|
158
|
-
<canvas #glCanvas style="display: block;"></canvas>
|
|
159
|
-
</div>
|
|
160
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgxResize, selector: "[ngxResize]", inputs: ["ngxResizeOptions"], outputs: ["ngxResize"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
161
|
-
}
|
|
162
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtCanvas, decorators: [{
|
|
163
|
-
type: Component,
|
|
164
|
-
args: [{
|
|
165
|
-
selector: 'ngt-canvas',
|
|
166
|
-
standalone: true,
|
|
167
|
-
template: `
|
|
168
|
-
<div (ngxResize)="resizeResult.set($event)" style="height: 100%; width: 100%;">
|
|
169
|
-
<canvas #glCanvas style="display: block;"></canvas>
|
|
170
|
-
</div>
|
|
171
|
-
`,
|
|
172
|
-
imports: [NgxResize],
|
|
173
|
-
providers: [
|
|
174
|
-
provideResizeOptions({
|
|
175
|
-
emitInZone: false,
|
|
176
|
-
emitInitialResult: true,
|
|
177
|
-
debounce: { scroll: 50, resize: 0 },
|
|
178
|
-
}),
|
|
179
|
-
provideStore(),
|
|
180
|
-
],
|
|
181
|
-
host: {
|
|
182
|
-
style: 'display: block;position: relative;width: 100%;height: 100%;overflow: hidden;',
|
|
183
|
-
'[style.pointerEvents]': 'hbPointerEvents()',
|
|
184
|
-
},
|
|
185
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
186
|
-
}]
|
|
187
|
-
}], ctorParameters: () => [] });
|
|
188
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY2FudmFzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsUUFBUSxFQUNSLHlCQUF5QixFQUN6QixVQUFVLEVBQ1YsTUFBTSxFQUNOLFVBQVUsRUFDVixtQkFBbUIsRUFDbkIsTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixNQUFNLEVBRU4sU0FBUyxFQUNULFNBQVMsRUFDVCxnQkFBZ0IsR0FDaEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBK0IsTUFBTSxtQkFBbUIsQ0FBQztBQUVqRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hELE9BQU8sRUFBRSwyQkFBMkIsRUFBeUIsTUFBTSxTQUFTLENBQUM7QUFDN0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXBELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7O0FBeUJoQyxNQUFNLE9BQU8sU0FBUztJQXVEckI7UUF0RFEsVUFBSyxHQUFHLFdBQVcsRUFBRSxDQUFDO1FBQ3RCLGFBQVEsR0FBRywyQkFBMkIsRUFBRSxDQUFDO1FBRXpDLFNBQUksR0FBRyxNQUFNLENBQTBCLFVBQVUsQ0FBQyxDQUFDO1FBQ25ELFNBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFD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LEVBQUUsQ0FBQztJQUM5QyxDQUFDOytHQWxLVyxTQUFTO21HQUFULFNBQVMsNmdGQWRWO1lBQ1Ysb0JBQW9CLENBQUM7Z0JBQ3BCLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixpQkFBaUIsRUFBRSxJQUFJO2dCQUN2QixRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUU7YUFDbEIsQ0FBQztZQUNuQixZQUFZLEVBQUU7U0FDZCxrT0FtRHlFLGdCQUFnQiw2Q0FoRWhGOzs7O0VBSVQsNERBQ1MsU0FBUzs7NEZBZVAsU0FBUztrQkF2QnJCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7Ozs7RUFJVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUM7b0JBQ3BCLFNBQVMsRUFBRTt3QkFDVixvQkFBb0IsQ0FBQzs0QkFDcEIsVUFBVSxFQUFFLEtBQUs7NEJBQ2pCLGlCQUFpQixFQUFFLElBQUk7NEJBQ3ZCLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRTt5QkFDbEIsQ0FBQzt3QkFDbkIsWUFBWSxFQUFFO3FCQUNkO29CQUNELElBQUksRUFBRTt3QkFDTCxLQUFLLEVBQUUsOEVBQThFO3dCQUNyRix1QkFBdUIsRUFBRSxtQkFBbUI7cUJBQzVDO29CQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUMvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdGFmdGVyTmV4dFJlbmRlcixcblx0Ym9vbGVhbkF0dHJpYnV0ZSxcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Q29tcG9uZW50UmVmLFxuXHRjb21wdXRlZCxcblx0Y3JlYXRlRW52aXJvbm1lbnRJbmplY3Rvcixcblx0RGVzdHJveVJlZixcblx0ZWZmZWN0LFxuXHRFbGVtZW50UmVmLFxuXHRFbnZpcm9ubWVudEluamVjdG9yLFxuXHRpbmplY3QsXG5cdEluamVjdG9yLFxuXHRpbnB1dCxcblx0Tmdab25lLFxuXHRvdXRwdXQsXG5cdHNpZ25hbCxcblx0VHlwZSxcblx0dW50cmFja2VkLFxuXHR2aWV3Q2hpbGQsXG5cdFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgb3V0cHV0RnJvbU9ic2VydmFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBOZ3hSZXNpemUsIHByb3ZpZGVSZXNpemVPcHRpb25zLCBSZXNpemVPcHRpb25zLCBSZXNpemVSZXN1bHQgfSBmcm9tICduZ3h0ZW5zaW9uL3Jlc2l6ZSc7XG5pbXBvcnQgeyBSYXljYXN0ZXIsIFNjZW5lLCBWZWN0b3IzIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgY3JlYXRlUG9pbnRlckV2ZW50cyB9IGZyb20gJy4vZG9tL2V2ZW50cyc7XG5pbXBvcnQgeyBwcm92aWRlTmd0UmVuZGVyZXIgfSBmcm9tICcuL3JlbmRlcmVyJztcbmltcG9ydCB7IGluamVjdENhbnZhc1Jvb3RJbml0aWFsaXplciwgTmd0Q2FudmFzQ29uZmlndXJhdG9yIH0gZnJvbSAnLi9yb290cyc7XG5pbXBvcnQgeyBOZ3RSb3V0ZWRTY2VuZSB9IGZyb20gJy4vcm91dGVkLXNjZW5lJztcbmltcG9ydCB7IGluamVjdFN0b3JlLCBwcm92aWRlU3RvcmUgfSBmcm9tICcuL3N0b3JlJztcbmltcG9ydCB7IE5ndENhbnZhc09wdGlvbnMsIE5ndERvbUV2ZW50LCBOZ3REcHIsIE5ndEdMT3B0aW9ucywgTmd0UGVyZm9ybWFuY2UsIE5ndFNpemUsIE5ndFN0YXRlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBpcyB9IGZyb20gJy4vdXRpbHMvaXMnO1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3QtY2FudmFzJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8ZGl2IChuZ3hSZXNpemUpPVwicmVzaXplUmVzdWx0LnNldCgkZXZlbnQpXCIgc3R5bGU9XCJoZWlnaHQ6IDEwMCU7IHdpZHRoOiAxMDAlO1wiPlxuXHRcdFx0PGNhbnZhcyAjZ2xDYW52YXMgc3R5bGU9XCJkaXNwbGF5OiBibG9jaztcIj48L2NhbnZhcz5cblx0XHQ8L2Rpdj5cblx0YCxcblx0aW1wb3J0czogW05neFJlc2l6ZV0sXG5cdHByb3ZpZGVyczogW1xuXHRcdHByb3ZpZGVSZXNpemVPcHRpb25zKHtcblx0XHRcdGVtaXRJblpvbmU6IGZhbHNlLFxuXHRcdFx0ZW1pdEluaXRpYWxSZXN1bHQ6IHRydWUsXG5cdFx0XHRkZWJvdW5jZTogeyBzY3JvbGw6IDUwLCByZXNpemU6IDAgfSxcblx0XHR9IGFzIFJlc2l6ZU9wdGlvbnMpLFxuXHRcdHByb3ZpZGVTdG9yZSgpLFxuXHRdLFxuXHRob3N0OiB7XG5cdFx0c3R5bGU6ICdkaXNwbGF5OiBibG9jaztwb3NpdGlvbjogcmVsYXRpdmU7d2lkdGg6IDEwMCU7aGVpZ2h0OiAxMDAlO292ZXJmbG93OiBoaWRkZW47Jyxcblx0XHQnW3N0eWxlLnBvaW50ZXJFdmVudHNdJzogJ2hiUG9pbnRlckV2ZW50cygpJyxcblx0fSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE5ndENhbnZhcyB7XG5cdHByaXZhdGUgc3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXHRwcml2YXRlIGluaXRSb290ID0gaW5qZWN0Q2FudmFzUm9vdEluaXRpYWxpemVyKCk7XG5cblx0cHJpdmF0ZSBob3N0ID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcblx0cHJpdmF0ZSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cdHByaXZhdGUgZW52aXJvbm1lbnRJbmplY3RvciA9IGluamVjdChFbnZpcm9ubWVudEluamVjdG9yKTtcblx0cHJpdmF0ZSBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG5cblx0c2NlbmVHcmFwaCA9IGlucHV0LnJlcXVpcmVkPFR5cGU8YW55PiwgVHlwZTxhbnk+IHwgJ3JvdXRlZCc+KHtcblx0XHR0cmFuc2Zvcm06ICh2YWx1ZSkgPT4ge1xuXHRcdFx0aWYgKHZhbHVlID09PSAncm91dGVkJykge1xuXHRcdFx0XHRjb25zb2xlLndhcm4oYFtOR1RdICdyb3V0ZWQnIHNjZW5lR3JhcGggaXMgbm90IHdvcmtpbmcgcHJvcGVybHkuYCk7XG5cdFx0XHRcdHJldHVybiBOZ3RSb3V0ZWRTY2VuZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9LFxuXHR9KTtcblx0Z2wgPSBpbnB1dDxOZ3RHTE9wdGlvbnM+KCk7XG5cdHNpemUgPSBpbnB1dDxOZ3RTaXplPigpO1xuXHRzaGFkb3dzID0gaW5wdXQoZmFsc2UsIHtcblx0XHR0cmFuc2Zvcm06ICh2YWx1ZSkgPT4ge1xuXHRcdFx0aWYgKHZhbHVlID09PSAnJykgcmV0dXJuIGJvb2xlYW5BdHRyaWJ1dGUodmFsdWUpO1xuXHRcdFx0cmV0dXJuIHZhbHVlIGFzIE5vbk51bGxhYmxlPE5ndENhbnZhc09wdGlvbnNbJ3NoYWRvd3MnXT47XG5cdFx0fSxcblx0fSk7XG5cdGxlZ2FjeSA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblx0bGluZWFyID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuXHRmbGF0ID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuXHRvcnRob2dyYXBoaWMgPSBpbnB1dChmYWxzZSwgeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSk7XG5cdGZyYW1lbG9vcCA9IGlucHV0PE5vbk51bGxhYmxlPE5ndENhbnZhc09wdGlvbnNbJ2ZyYW1lbG9vcCddPj4oJ2Fsd2F5cycpO1xuXHRwZXJmb3JtYW5jZSA9IGlucHV0PFBhcnRpYWw8T21pdDxOZ3RQZXJmb3JtYW5jZSwgJ3JlZ3Jlc3MnPj4+KCk7XG5cdGRwciA9IGlucHV0PE5ndERwcj4oWzEsIDJdKTtcblx0cmF5Y2FzdGVyID0gaW5wdXQ8UGFydGlhbDxSYXljYXN0ZXI+PigpO1xuXHRzY2VuZSA9IGlucHV0PFNjZW5lIHwgUGFydGlhbDxTY2VuZT4+KCk7XG5cdGNhbWVyYSA9IGlucHV0PE5vbk51bGxhYmxlPE5ndENhbnZhc09wdGlvbnNbJ2NhbWVyYSddPj4oKTtcblx0ZXZlbnRzID0gaW5wdXQoY3JlYXRlUG9pbnRlckV2ZW50cyk7XG5cdGV2ZW50U291cmNlID0gaW5wdXQ8SFRNTEVsZW1lbnQgfCBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oKTtcblx0ZXZlbnRQcmVmaXggPSBpbnB1dDxOb25OdWxsYWJsZTxOZ3RDYW52YXNPcHRpb25zWydldmVudFByZWZpeCddPj4oJ29mZnNldCcpO1xuXHRsb29rQXQgPSBpbnB1dDxWZWN0b3IzIHwgUGFyYW1ldGVyczxWZWN0b3IzWydzZXQnXT4+KCk7XG5cdGNyZWF0ZWQgPSBvdXRwdXQ8Tmd0U3RhdGU+KCk7XG5cdHBvaW50ZXJNaXNzZWQgPSBvdXRwdXRGcm9tT2JzZXJ2YWJsZSh0aGlzLnN0b3JlLmdldCgncG9pbnRlck1pc3NlZCQnKSk7XG5cblx0cHJpdmF0ZSBnbENhbnZhcyA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxDYW52YXNFbGVtZW50Pj4oJ2dsQ2FudmFzJyk7XG5cdHByaXZhdGUgZ2xDYW52YXNWaWV3Q29udGFpbmVyUmVmID0gdmlld0NoaWxkLnJlcXVpcmVkKCdnbENhbnZhcycsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KTtcblxuXHRwcm90ZWN0ZWQgaGJQb2ludGVyRXZlbnRzID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMuZXZlbnRTb3VyY2UoKSA/ICdub25lJyA6ICdhdXRvJykpO1xuXG5cdC8vIE5PVEU6IHRoaXMgc2lnbmFsIGlzIHVwZGF0ZWQgb3V0c2lkZSBvZiBab25lXG5cdHByb3RlY3RlZCByZXNpemVSZXN1bHQgPSBzaWduYWw8UmVzaXplUmVzdWx0Pih7fSBhcyBSZXNpemVSZXN1bHQsIHsgZXF1YWw6IE9iamVjdC5pcyB9KTtcblx0cHJpdmF0ZSBjb25maWd1cmF0b3IgPSBzaWduYWw8Tmd0Q2FudmFzQ29uZmlndXJhdG9yIHwgbnVsbD4obnVsbCk7XG5cblx0cHJpdmF0ZSBnbEVudmlyb25tZW50SW5qZWN0b3I/OiBFbnZpcm9ubWVudEluamVjdG9yO1xuXHRwcml2YXRlIGdsUmVmPzogQ29tcG9uZW50UmVmPHVua25vd24+O1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdC8vIE5PVEU6IHRoaXMgbWVhbnMgdGhhdCBldmVyeXRoaW5nIGluIE5ndENhbnZhcyB3aWxsIGJlIGluIGFmdGVyTmV4dFJlbmRlci5cblx0XHQvLyB0aGlzIGFsbG93cyB0aGUgY29udGVudCBvZiBOZ3RDYW52YXMgdG8gdXNlIGVmZmVjdCBpbnN0ZWFkIG9mIGFmdGVyTmV4dFJlbmRlclxuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHRjb25zdCBjYW52YXNFbGVtZW50ID0gdGhpcy5nbENhbnZhcygpLm5hdGl2ZUVsZW1lbnQ7XG5cdFx0XHR0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmNvbmZpZ3VyYXRvci5zZXQodGhpcy5pbml0Um9vdChjYW52YXNFbGVtZW50KSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0ZWZmZWN0KFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgcmVzaXplUmVzdWx0ID0gdGhpcy5yZXNpemVSZXN1bHQoKTtcblx0XHRcdFx0XHRpZiAoIXJlc2l6ZVJlc3VsdC53aWR0aCB8fCByZXNpemVSZXN1bHQud2lkdGggPD0gMCB8fCAhcmVzaXplUmVzdWx0LmhlaWdodCB8fCByZXNpemVSZXN1bHQuaGVpZ2h0IDw9IDApXG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHRjb25zdCBjb25maWd1cmF0b3IgPSB0aGlzLmNvbmZpZ3VyYXRvcigpO1xuXHRcdFx0XHRcdGlmICghY29uZmlndXJhdG9yKSByZXR1cm47XG5cblx0XHRcdFx0XHRjb25zdCBjYW52YXNPcHRpb25zID0ge1xuXHRcdFx0XHRcdFx0Z2w6IHRoaXMuZ2woKSxcblx0XHRcdFx0XHRcdHNoYWRvd3M6IHRoaXMuc2hhZG93cygpLFxuXHRcdFx0XHRcdFx0bGVnYWN5OiB0aGlzLmxlZ2FjeSgpLFxuXHRcdFx0XHRcdFx0bGluZWFyOiB0aGlzLmxpbmVhcigpLFxuXHRcdFx0XHRcdFx0ZmxhdDogdGhpcy5mbGF0KCksXG5cdFx0XHRcdFx0XHRvcnRob2dyYXBoaWM6IHRoaXMub3J0aG9ncmFwaGljKCksXG5cdFx0XHRcdFx0XHRmcmFtZWxvb3A6IHRoaXMuZnJhbWVsb29wKCksXG5cdFx0XHRcdFx0XHRwZXJmb3JtYW5jZTogdGhpcy5wZXJmb3JtYW5jZSgpLFxuXHRcdFx0XHRcdFx0ZHByOiB0aGlzLmRwcigpLFxuXHRcdFx0XHRcdFx0cmF5Y2FzdGVyOiB0aGlzLnJheWNhc3RlcigpLFxuXHRcdFx0XHRcdFx0c2NlbmU6IHRoaXMuc2NlbmUoKSxcblx0XHRcdFx0XHRcdGNhbWVyYTogdGhpcy5jYW1lcmEoKSxcblx0XHRcdFx0XHRcdGV2ZW50czogdGhpcy5ldmVudHMoKSxcblx0XHRcdFx0XHRcdGV2ZW50U291cmNlOiB0aGlzLmV2ZW50U291cmNlKCksXG5cdFx0XHRcdFx0XHRldmVudFByZWZpeDogdGhpcy5ldmVudFByZWZpeCgpLFxuXHRcdFx0XHRcdFx0bG9va0F0OiB0aGlzLmxvb2tBdCgpLFxuXHRcdFx0XHRcdFx0c2l6ZTogcmVzaXplUmVzdWx0LFxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHR0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uZmlndXJhdG9yLmNvbmZpZ3VyZShjYW52YXNPcHRpb25zKTtcblxuXHRcdFx0XHRcdFx0dW50cmFja2VkKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuZ2xSZWYpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdsUmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLm5vWm9uZVJlbmRlcigpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0eyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9LFxuXHRcdFx0KTtcblx0XHR9KTtcblxuXHRcdGluamVjdChEZXN0cm95UmVmKS5vbkRlc3Ryb3koKCkgPT4ge1xuXHRcdFx0dGhpcy5nbFJlZj8uZGVzdHJveSgpO1xuXHRcdFx0dGhpcy5nbEVudmlyb25tZW50SW5qZWN0b3I/LmRlc3Ryb3koKTtcblx0XHRcdHRoaXMuY29uZmlndXJhdG9yKCk/LmRlc3Ryb3koKTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgbm9ab25lUmVuZGVyKCkge1xuXHRcdC8vIE5PVEU6IGRlc3Ryb3kgcHJldmlvdXMgaW5zdGFuY2VzIGlmIGV4aXN0ZWRcblx0XHR0aGlzLmdsRW52aXJvbm1lbnRJbmplY3Rvcj8uZGVzdHJveSgpO1xuXHRcdHRoaXMuZ2xSZWY/LmRlc3Ryb3koKTtcblxuXHRcdC8vIE5PVEU6IEZsYWcgdGhlIGNhbnZhcyBhY3RpdmUsIHJlbmRlcmluZyB3aWxsIG5vdyBiZWdpblxuXHRcdHRoaXMuc3RvcmUudXBkYXRlKChzdGF0ZSkgPT4gKHsgaW50ZXJuYWw6IHsgLi4uc3RhdGUuaW50ZXJuYWwsIGFjdGl2ZTogdHJ1ZSB9IH0pKTtcblxuXHRcdGNvbnN0IFtzdGF0ZSwgZXZlbnRTb3VyY2UsIGV2ZW50UHJlZml4XSA9IFtcblx0XHRcdHRoaXMuc3RvcmUuc25hcHNob3QsXG5cdFx0XHR1bnRyYWNrZWQodGhpcy5ldmVudFNvdXJjZSksXG5cdFx0XHR1bnRyYWNrZWQodGhpcy5ldmVudFByZWZpeCksXG5cdFx0XTtcblxuXHRcdC8vIGNvbm5lY3QgdG8gZXZlbnQgc291cmNlXG5cdFx0c3RhdGUuZXZlbnRzLmNvbm5lY3Q/Lihcblx0XHRcdGV2ZW50U291cmNlID8gKGlzLnJlZihldmVudFNvdXJjZSkgPyBldmVudFNvdXJjZS5uYXRpdmVFbGVtZW50IDogZXZlbnRTb3VyY2UpIDogdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQsXG5cdFx0KTtcblxuXHRcdC8vIHNldHVwIGNvbXB1dGUgZm9yIGV2ZW50UHJlZml4XG5cdFx0aWYgKGV2ZW50UHJlZml4KSB7XG5cdFx0XHRzdGF0ZS5zZXRFdmVudHMoe1xuXHRcdFx0XHRjb21wdXRlOiAoZXZlbnQsIHN0b3JlKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgeyBwb2ludGVyLCByYXljYXN0ZXIsIGNhbWVyYSwgc2l6ZSB9ID0gc3RvcmUuc25hcHNob3Q7XG5cdFx0XHRcdFx0Y29uc3QgeCA9IGV2ZW50WyhldmVudFByZWZpeCArICdYJykgYXMga2V5b2YgTmd0RG9tRXZlbnRdIGFzIG51bWJlcjtcblx0XHRcdFx0XHRjb25zdCB5ID0gZXZlbnRbKGV2ZW50UHJlZml4ICsgJ1knKSBhcyBrZXlvZiBOZ3REb21FdmVudF0gYXMgbnVtYmVyO1xuXHRcdFx0XHRcdHBvaW50ZXIuc2V0KCh4IC8gc2l6ZS53aWR0aCkgKiAyIC0gMSwgLSh5IC8gc2l6ZS5oZWlnaHQpICogMiArIDEpO1xuXHRcdFx0XHRcdHJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHBvaW50ZXIsIGNhbWVyYSk7XG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvLyBlbWl0IGNyZWF0ZWQgZXZlbnQgaWYgb2JzZXJ2ZWRcblx0XHR0aGlzLmNyZWF0ZWQuZW1pdCh0aGlzLnN0b3JlLnNuYXBzaG90KTtcblxuXHRcdGlmICghdGhpcy5zdG9yZS5nZXQoJ2V2ZW50cycsICdjb25uZWN0ZWQnKSkge1xuXHRcdFx0dGhpcy5zdG9yZS5nZXQoJ2V2ZW50cycpLmNvbm5lY3Q/Lih1bnRyYWNrZWQodGhpcy5nbENhbnZhcykubmF0aXZlRWxlbWVudCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5nbEVudmlyb25tZW50SW5qZWN0b3IgPSBjcmVhdGVFbnZpcm9ubWVudEluamVjdG9yKFtwcm92aWRlTmd0UmVuZGVyZXIodGhpcy5zdG9yZSldLCB0aGlzLmVudmlyb25tZW50SW5qZWN0b3IpO1xuXHRcdHRoaXMuZ2xSZWYgPSB1bnRyYWNrZWQodGhpcy5nbENhbnZhc1ZpZXdDb250YWluZXJSZWYpLmNyZWF0ZUNvbXBvbmVudCh1bnRyYWNrZWQodGhpcy5zY2VuZUdyYXBoKSwge1xuXHRcdFx0ZW52aXJvbm1lbnRJbmplY3RvcjogdGhpcy5nbEVudmlyb25tZW50SW5qZWN0b3IsXG5cdFx0XHRpbmplY3RvcjogdGhpcy5pbmplY3Rvcixcblx0XHR9KTtcblxuXHRcdHRoaXMuZ2xSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXHR9XG59XG4iXX0=
|