angular-three 1.9.16 → 1.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/esm2022/lib/canvas.mjs +243 -0
  2. package/esm2022/lib/directives/args.mjs +36 -0
  3. package/esm2022/lib/directives/common.mjs +32 -0
  4. package/esm2022/lib/directives/parent.mjs +36 -0
  5. package/esm2022/lib/directives/repeat.mjs +18 -0
  6. package/esm2022/lib/loader.mjs +55 -0
  7. package/esm2022/lib/pipes/push.mjs +50 -0
  8. package/esm2022/lib/portal.mjs +240 -0
  9. package/esm2022/lib/renderer/renderer.mjs +361 -0
  10. package/esm2022/lib/routed-scene.mjs +29 -0
  11. package/esm2022/lib/stores/rx-store.mjs +108 -0
  12. package/esm2022/lib/stores/store.mjs +404 -0
  13. package/esm2022/lib/types.mjs +2 -0
  14. package/esm2022/lib/utils/apply-props.mjs +107 -0
  15. package/esm2022/lib/utils/is.mjs +51 -0
  16. package/{fesm2020 → fesm2022}/angular-three.mjs +78 -61
  17. package/fesm2022/angular-three.mjs.map +1 -0
  18. package/lib/canvas.d.ts +1 -1
  19. package/lib/directives/args.d.ts +1 -1
  20. package/lib/directives/parent.d.ts +1 -1
  21. package/lib/directives/repeat.d.ts +1 -1
  22. package/lib/loader.d.ts +3 -11
  23. package/lib/portal.d.ts +2 -2
  24. package/lib/types.d.ts +91 -120
  25. package/lib/utils/is.d.ts +6 -1
  26. package/metadata.json +1 -0
  27. package/package.json +13 -17
  28. package/plugin/package.json +1 -4
  29. package/plugin/src/generators/init/compat.js +1 -1
  30. package/plugin/src/generators/init/compat.js.map +1 -1
  31. package/plugin/src/generators/init/init.d.ts +3 -3
  32. package/plugin/src/generators/init/init.js +23 -3
  33. package/plugin/src/generators/init/init.js.map +1 -1
  34. package/web-types.json +1 -0
  35. package/esm2020/lib/canvas.mjs +0 -242
  36. package/esm2020/lib/directives/args.mjs +0 -35
  37. package/esm2020/lib/directives/common.mjs +0 -31
  38. package/esm2020/lib/directives/parent.mjs +0 -35
  39. package/esm2020/lib/directives/repeat.mjs +0 -17
  40. package/esm2020/lib/loader.mjs +0 -56
  41. package/esm2020/lib/pipes/push.mjs +0 -49
  42. package/esm2020/lib/portal.mjs +0 -237
  43. package/esm2020/lib/renderer/renderer.mjs +0 -360
  44. package/esm2020/lib/routed-scene.mjs +0 -28
  45. package/esm2020/lib/stores/rx-store.mjs +0 -107
  46. package/esm2020/lib/stores/store.mjs +0 -402
  47. package/esm2020/lib/types.mjs +0 -2
  48. package/esm2020/lib/utils/apply-props.mjs +0 -91
  49. package/esm2020/lib/utils/is.mjs +0 -50
  50. package/fesm2015/angular-three.mjs +0 -3051
  51. package/fesm2015/angular-three.mjs.map +0 -1
  52. package/fesm2020/angular-three.mjs.map +0 -1
  53. /package/{esm2020 → esm2022}/angular-three.mjs +0 -0
  54. /package/{esm2020 → esm2022}/index.mjs +0 -0
  55. /package/{esm2020 → esm2022}/lib/di/before-render.mjs +0 -0
  56. /package/{esm2020 → esm2022}/lib/di/catalogue.mjs +0 -0
  57. /package/{esm2020 → esm2022}/lib/di/destroy.mjs +0 -0
  58. /package/{esm2020 → esm2022}/lib/di/ref.mjs +0 -0
  59. /package/{esm2020 → esm2022}/lib/di/run-in-context.mjs +0 -0
  60. /package/{esm2020 → esm2022}/lib/events.mjs +0 -0
  61. /package/{esm2020 → esm2022}/lib/loop.mjs +0 -0
  62. /package/{esm2020 → esm2022}/lib/renderer/di.mjs +0 -0
  63. /package/{esm2020 → esm2022}/lib/renderer/enums.mjs +0 -0
  64. /package/{esm2020 → esm2022}/lib/renderer/provider.mjs +0 -0
  65. /package/{esm2020 → esm2022}/lib/renderer/store.mjs +0 -0
  66. /package/{esm2020 → esm2022}/lib/renderer/utils.mjs +0 -0
  67. /package/{esm2020 → esm2022}/lib/utils/attach.mjs +0 -0
  68. /package/{esm2020 → esm2022}/lib/utils/instance.mjs +0 -0
  69. /package/{esm2020 → esm2022}/lib/utils/make.mjs +0 -0
  70. /package/{esm2020 → esm2022}/lib/utils/safe-detect-changes.mjs +0 -0
  71. /package/{esm2020 → esm2022}/lib/utils/update.mjs +0 -0
  72. /package/{esm2020 → esm2022}/lib/web/events.mjs +0 -0
package/lib/canvas.d.ts CHANGED
@@ -42,5 +42,5 @@ export declare class NgtCanvas extends NgtRxStore<NgtCanvasInputs> implements On
42
42
  private overrideDetectChanges;
43
43
  private setSceneGraphInputs;
44
44
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtCanvas, never>;
45
- static ɵcmp: i0.ɵɵComponentDeclaration<NgtCanvas, "ngt-canvas", never, { "sceneGraph": "sceneGraph"; "sceneGraphInputs": "sceneGraphInputs"; "compoundPrefixes": "compoundPrefixes"; "linear": "linear"; "legacy": "legacy"; "flat": "flat"; "orthographic": "orthographic"; "frameloop": "frameloop"; "dpr": "dpr"; "raycaster": "raycaster"; "shadows": "shadows"; "camera": "camera"; "gl": "gl"; "eventSource": "eventSource"; "eventPrefix": "eventPrefix"; "lookAt": "lookAt"; "performance": "performance"; }, { "created": "created"; "pointerMissed": "pointerMissed"; }, never, never, true, never>;
45
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtCanvas, "ngt-canvas", never, { "sceneGraph": { "alias": "sceneGraph"; "required": false; }; "sceneGraphInputs": { "alias": "sceneGraphInputs"; "required": false; }; "compoundPrefixes": { "alias": "compoundPrefixes"; "required": false; }; "linear": { "alias": "linear"; "required": false; }; "legacy": { "alias": "legacy"; "required": false; }; "flat": { "alias": "flat"; "required": false; }; "orthographic": { "alias": "orthographic"; "required": false; }; "frameloop": { "alias": "frameloop"; "required": false; }; "dpr": { "alias": "dpr"; "required": false; }; "raycaster": { "alias": "raycaster"; "required": false; }; "shadows": { "alias": "shadows"; "required": false; }; "camera": { "alias": "camera"; "required": false; }; "gl": { "alias": "gl"; "required": false; }; "eventSource": { "alias": "eventSource"; "required": false; }; "eventPrefix": { "alias": "eventPrefix"; "required": false; }; "lookAt": { "alias": "lookAt"; "required": false; }; "performance": { "alias": "performance"; "required": false; }; }, { "created": "created"; "pointerMissed": "pointerMissed"; }, never, never, true, never>;
46
46
  }
@@ -6,5 +6,5 @@ export declare class NgtArgs extends NgtCommonDirective {
6
6
  get args(): any[] | null;
7
7
  validate(): boolean;
8
8
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtArgs, never>;
9
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgtArgs, "[args]", never, { "args": "args"; }, {}, never, never, true, never>;
9
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgtArgs, "[args]", never, { "args": { "alias": "args"; "required": false; }; }, {}, never, never, true, never>;
10
10
  }
@@ -7,5 +7,5 @@ export declare class NgtParent extends NgtCommonDirective {
7
7
  get parent(): string | THREE.Object3D | NgtInjectedRef<THREE.Object3D>;
8
8
  validate(): boolean;
9
9
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtParent, never>;
10
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgtParent, "[parent]", never, { "parent": "parent"; }, {}, never, never, true, never>;
10
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgtParent, "[parent]", never, { "parent": { "alias": "parent"; "required": false; }; }, {}, never, never, true, never>;
11
11
  }
@@ -3,5 +3,5 @@ import * as i0 from "@angular/core";
3
3
  export declare class NgtRepeat extends NgForOf<number> {
4
4
  set ngForRepeat(count: number);
5
5
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtRepeat, never>;
6
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgtRepeat, "[ngFor][ngForRepeat]", never, { "ngForRepeat": "ngForRepeat"; }, {}, never, never, true, never>;
6
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgtRepeat, "[ngFor][ngForRepeat]", never, { "ngForRepeat": { "alias": "ngForRepeat"; "required": false; }; }, {}, never, never, true, never>;
7
7
  }
package/lib/loader.d.ts CHANGED
@@ -1,15 +1,7 @@
1
- import { Observable } from 'rxjs';
1
+ import { type Observable } from 'rxjs';
2
2
  import type { GLTF } from 'three/examples/jsm/loaders/GLTFLoader';
3
- import type { NgtBranchingReturn, NgtLoaderExtensions, NgtLoaderResult, NgtObjectMap } from './types';
4
- interface NgtLoader {
5
- <TReturnType, TUrl extends string | string[] | Record<string, string>>(loaderConstructorFactory: (inputs: TUrl) => new (...args: any[]) => NgtLoaderResult<TReturnType>, input: TUrl | Observable<TUrl>, extensions?: NgtLoaderExtensions<NgtLoaderResult<TReturnType>>, onProgress?: (event: ProgressEvent) => void): Observable<TUrl extends string[] ? Array<NgtBranchingReturn<TReturnType, GLTF, GLTF & NgtObjectMap>> : TUrl extends object ? {
6
- [key in keyof TUrl]: NgtBranchingReturn<TReturnType, GLTF, GLTF & NgtObjectMap>;
7
- } : NgtBranchingReturn<TReturnType, GLTF, GLTF & NgtObjectMap>>;
8
- destroy: () => void;
9
- preLoad: <TReturnType, TUrl extends string | string[] | Record<string, string>>(loaderConstructorFactory: (inputs: TUrl) => new (...args: any[]) => NgtLoaderResult<TReturnType>, inputs: TUrl | Observable<TUrl>, extensions?: NgtLoaderExtensions) => void;
10
- }
3
+ import type { NgtBranchingReturn, NgtLoaderExtensions, NgtLoaderProto, NgtLoaderReturnType, NgtObjectMap } from './types';
11
4
  export type NgtLoaderResults<TInput extends string | string[] | Record<string, string>, TReturn> = TInput extends string[] ? TReturn[] : TInput extends object ? {
12
5
  [key in keyof TInput]: TReturn;
13
6
  } : TReturn;
14
- export declare const injectNgtLoader: NgtLoader;
15
- export {};
7
+ export declare function injectNgtLoader<TData, TUrl extends string | string[] | Record<string, string>, TLoaderConstructor extends NgtLoaderProto<TData>, TReturn = NgtLoaderReturnType<TData, TLoaderConstructor>>(loaderConstructorFactory: (inputs: TUrl) => TLoaderConstructor, input: TUrl | Observable<TUrl>, extensions?: NgtLoaderExtensions<TLoaderConstructor>, onProgress?: (event: ProgressEvent) => void): Observable<NgtLoaderResults<TUrl, NgtBranchingReturn<TReturn, GLTF, GLTF & NgtObjectMap>>>;
package/lib/portal.d.ts CHANGED
@@ -23,7 +23,7 @@ export declare class NgtPortalBeforeRender implements OnInit, OnDestroy {
23
23
  ngOnInit(): void;
24
24
  ngOnDestroy(): void;
25
25
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtPortalBeforeRender, never>;
26
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgtPortalBeforeRender, "[ngtPortalBeforeRender]", never, { "renderPriority": "renderPriority"; "parentScene": "parentScene"; "parentCamera": "parentCamera"; }, { "beforeRender": "beforeRender"; }, never, never, true, never>;
26
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgtPortalBeforeRender, "[ngtPortalBeforeRender]", never, { "renderPriority": { "alias": "renderPriority"; "required": false; }; "parentScene": { "alias": "parentScene"; "required": false; }; "parentCamera": { "alias": "parentCamera"; "required": false; }; }, { "beforeRender": "beforeRender"; }, never, never, true, never>;
27
27
  }
28
28
  export declare class NgtPortalContent {
29
29
  constructor(vcr: ViewContainerRef, parentVcr: ViewContainerRef);
@@ -55,6 +55,6 @@ export declare class NgtPortal extends NgtRxStore<NgtPortalInputs> implements On
55
55
  ngOnDestroy(): void;
56
56
  private inject;
57
57
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtPortal, never>;
58
- static ɵcmp: i0.ɵɵComponentDeclaration<NgtPortal, "ngt-portal", never, { "container": "container"; "state": "state"; "autoRender": "autoRender"; "autoRenderPriority": "autoRenderPriority"; }, { "beforeRender": "beforeRender"; }, ["portalContentTemplate"], never, true, never>;
58
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtPortal, "ngt-portal", never, { "container": { "alias": "container"; "required": false; }; "state": { "alias": "state"; "required": false; }; "autoRender": { "alias": "autoRender"; "required": false; }; "autoRenderPriority": { "alias": "autoRenderPriority"; "required": false; }; }, { "beforeRender": "beforeRender"; }, ["portalContentTemplate"], never, true, never>;
59
59
  }
60
60
  export {};
package/lib/types.d.ts CHANGED
@@ -4,13 +4,9 @@ import type { BehaviorSubject } from 'rxjs';
4
4
  import * as THREE from 'three';
5
5
  import type { NgtRxStore } from './stores/rx-store';
6
6
  export type NgtAnyRecord = Record<string, any>;
7
- export type NgtNonFunctionKeys<T> = {
8
- [K in keyof T]-?: T[K] extends Function ? never : K;
9
- }[keyof T];
10
7
  export type NgtProperties<T> = Pick<T, {
11
8
  [K in keyof T]: T[K] extends (_: any) => any ? never : K;
12
9
  }[keyof T]>;
13
- export type NgtOverwrite<T, O> = Omit<T, NgtNonFunctionKeys<O>> & O;
14
10
  export type NgtEquConfig = {
15
11
  /** Compare arrays by reference equality a === b (default), or by shallow equality */
16
12
  arrays?: 'reference' | 'shallow';
@@ -19,18 +15,48 @@ export type NgtEquConfig = {
19
15
  /** If true the keys in both a and b must match 1:1 (default), if false a's keys must intersect b's */
20
16
  strict?: boolean;
21
17
  };
22
- export interface NgtIntersection extends THREE.Intersection {
23
- /** The event source (the object which registered the handler) */
24
- eventObject: THREE.Object3D;
25
- }
26
- export interface NgtPointerCaptureTarget {
27
- intersection: NgtIntersection;
28
- target: Element;
29
- }
18
+ export type NgtDpr = number | [min: number, max: number];
19
+ export type NgtSize = {
20
+ width: number;
21
+ height: number;
22
+ top: number;
23
+ left: number;
24
+ };
25
+ export type NgtViewport = NgtSize & {
26
+ /** The initial pixel ratio */
27
+ initialDpr: number;
28
+ /** Current pixel ratio */
29
+ dpr: number;
30
+ /** size.width / viewport.width */
31
+ factor: number;
32
+ /** Camera distance */
33
+ distance: number;
34
+ /** Camera aspect ratio: width / height */
35
+ aspect: number;
36
+ };
37
+ export type NgtPerformance = {
38
+ /** Current performance normal, between min and max */
39
+ current: number;
40
+ /** How low the performance can go, between 0 and max */
41
+ min: number;
42
+ /** How high the performance can go, between min and max */
43
+ max: number;
44
+ /** Time until current returns to max in ms */
45
+ debounce: number;
46
+ /** Sets current to min, puts the system in regression */
47
+ regress: () => void;
48
+ };
49
+ export type NgtRenderer = {
50
+ render: (scene: THREE.Scene, camera: THREE.Camera) => any;
51
+ };
30
52
  export type NgtCamera = THREE.OrthographicCamera | THREE.PerspectiveCamera;
31
53
  export type NgtCameraManual = NgtCamera & {
32
54
  manual?: boolean;
33
55
  };
56
+ export interface NgtIntersection extends THREE.Intersection {
57
+ /** The event source (the object which registered the handler) */
58
+ eventObject: THREE.Object3D;
59
+ }
34
60
  export interface NgtIntersectionEvent<TSourceEvent> extends NgtIntersection {
35
61
  /** The event source (the object which registered the handler) */
36
62
  eventObject: THREE.Object3D;
@@ -45,7 +71,7 @@ export interface NgtIntersectionEvent<TSourceEvent> extends NgtIntersection {
45
71
  /** The ray that pierced it */
46
72
  ray: THREE.Ray;
47
73
  /** The camera that was used by the raycaster */
48
- camera: NgtCamera;
74
+ camera: NgtCameraManual;
49
75
  /** stopPropagation will stop underlying handlers from firing */
50
76
  stopPropagation: () => void;
51
77
  /** The original host event */
@@ -55,19 +81,7 @@ export interface NgtIntersectionEvent<TSourceEvent> extends NgtIntersection {
55
81
  }
56
82
  export type NgtThreeEvent<TEvent> = NgtIntersectionEvent<TEvent> & NgtProperties<TEvent>;
57
83
  export type NgtDomEvent = PointerEvent | MouseEvent | WheelEvent;
58
- export interface NgtEvents {
59
- click: EventListener;
60
- contextmenu: EventListener;
61
- dblclick: EventListener;
62
- wheel: EventListener;
63
- pointerdown: EventListener;
64
- pointerup: EventListener;
65
- pointerleave: EventListener;
66
- pointermove: EventListener;
67
- pointercancel: EventListener;
68
- lostpointercapture: EventListener;
69
- }
70
- export interface NgtEventHandlers {
84
+ export type NgtEventHandlers = {
71
85
  click?: (event: NgtThreeEvent<MouseEvent>) => void;
72
86
  contextmenu?: (event: NgtThreeEvent<MouseEvent>) => void;
73
87
  dblclick?: (event: NgtThreeEvent<MouseEvent>) => void;
@@ -81,10 +95,13 @@ export interface NgtEventHandlers {
81
95
  pointermissed?: (event: MouseEvent) => void;
82
96
  pointercancel?: (event: NgtThreeEvent<PointerEvent>) => void;
83
97
  wheel?: (event: NgtThreeEvent<WheelEvent>) => void;
84
- }
98
+ };
99
+ export type NgtEvents = {
100
+ [TEvent in keyof NgtEventHandlers]-?: EventListener;
101
+ };
85
102
  export type NgtFilterFunction = (items: THREE.Intersection[], store: NgtRxStore<NgtState>) => THREE.Intersection[];
86
103
  export type NgtComputeFunction = (event: NgtDomEvent, root: NgtRxStore<NgtState>, previous?: NgtRxStore<NgtState>) => void;
87
- export interface NgtEventManager<TTarget = any> {
104
+ export type NgtEventManager<TTarget> = {
88
105
  /** Determines if the event layer is active */
89
106
  enabled: boolean;
90
107
  /** Event layer priority, higher prioritized layers come first and may stop(-propagate) lower layer */
@@ -101,56 +118,33 @@ export interface NgtEventManager<TTarget = any> {
101
118
  connect?: (target: TTarget) => void;
102
119
  /** Removes all existing events handlers from the target */
103
120
  disconnect?: () => void;
104
- }
105
- export interface NgtPerformance {
106
- /** Current performance normal, between min and max */
107
- current: number;
108
- /** How low the performance can go, between 0 and max */
109
- min: number;
110
- /** How high the performance can go, between min and max */
111
- max: number;
112
- /** Time until current returns to max in ms */
113
- debounce: number;
114
- /** Sets current to min, puts the system in regression */
115
- regress: () => void;
116
- }
117
- export type NgtDpr = number | [min: number, max: number];
118
- export type NgtSize = {
119
- width: number;
120
- height: number;
121
- top: number;
122
- left: number;
121
+ /** Triggers a onPointerMove with the last known event. This can be useful to enable raycasting without
122
+ * explicit user interaction, for instance when the camera moves a hoverable object underneath the cursor.
123
+ */
124
+ update?: () => void;
123
125
  };
124
- export type NgtViewport = NgtSize & {
125
- /** The initial pixel ratio */
126
- initialDpr: number;
127
- /** Current pixel ratio */
128
- dpr: number;
129
- /** size.width / viewport.width */
130
- factor: number;
131
- /** Camera distance */
132
- distance: number;
133
- /** Camera aspect ratio: width / height */
134
- aspect: number;
126
+ export type NgtPointerCaptureTarget = {
127
+ intersection: NgtIntersection;
128
+ target: Element;
135
129
  };
136
- export interface NgtRenderState extends NgtState {
130
+ export type NgtRenderState = NgtState & {
137
131
  delta: number;
138
132
  frame?: XRFrame;
139
- }
140
- export interface NgtBeforeRenderEvent<TObject extends NgtInstanceNode = NgtInstanceNode> {
133
+ };
134
+ export type NgtBeforeRenderEvent<TObject extends NgtInstanceNode = NgtInstanceNode> = {
141
135
  state: NgtRenderState;
142
136
  object: TObject;
143
- }
144
- export interface NgtBeforeRenderRecord {
137
+ };
138
+ export type NgtBeforeRenderRecord = {
145
139
  callback: (state: NgtRenderState) => void;
146
140
  store: NgtRxStore<NgtState>;
147
141
  priority?: number;
148
- }
149
- export interface NgtInternalState {
142
+ };
143
+ export type NgtInternalState = {
150
144
  active: boolean;
151
145
  priority: number;
152
146
  frames: number;
153
- lastEvent: NgtDomEvent;
147
+ lastEvent: NgtDomEvent | null;
154
148
  interaction: THREE.Object3D[];
155
149
  hovered: Map<string, NgtThreeEvent<NgtDomEvent>>;
156
150
  subscribers: NgtBeforeRenderRecord[];
@@ -158,14 +152,11 @@ export interface NgtInternalState {
158
152
  initialClick: [x: number, y: number];
159
153
  initialHits: THREE.Object3D[];
160
154
  subscribe: (callback: NgtBeforeRenderRecord['callback'], priority?: number, store?: NgtRxStore<NgtState>) => () => void;
161
- }
162
- export interface NgtState {
163
- /** Set current state */
164
- set: NgtRxStore<NgtState>['set'];
165
- /** Get current state */
155
+ };
156
+ export type NgtState = {
166
157
  get: NgtRxStore<NgtState>['get'];
167
- select: NgtRxStore<NgtState>['select'];
168
- /** canvas ready state */
158
+ set: NgtRxStore<NgtState>['set'];
159
+ /** when all building blocks are initialized */
169
160
  ready: boolean;
170
161
  /** The instance of the renderer */
171
162
  gl: THREE.WebGLRenderer;
@@ -178,7 +169,7 @@ export interface NgtState {
178
169
  /** Default clock */
179
170
  clock: THREE.Clock;
180
171
  /** Event layer interface, contains the event handler and the node they're connected to */
181
- events: NgtEventManager;
172
+ events: NgtEventManager<any>;
182
173
  /** XR interface */
183
174
  xr: {
184
175
  connect: () => void;
@@ -212,7 +203,7 @@ export interface NgtState {
212
203
  /**
213
204
  * Shortcut to manual sizing
214
205
  */
215
- setSize: (width: number, height: number, top?: number, left?: number, updateStyle?: boolean) => void;
206
+ setSize: (width: number, height: number, top?: number, left?: number) => void;
216
207
  /** Shortcut to manual setting the pixel ratio */
217
208
  setDpr: (dpr: NgtDpr) => void;
218
209
  /** Shortcut to frameloop flags */
@@ -223,16 +214,15 @@ export interface NgtState {
223
214
  previousStore?: NgtRxStore<NgtState>;
224
215
  /** Internals */
225
216
  internal: NgtInternalState;
226
- /** shortcuts for add and remove interaction */
227
- addInteraction: (interaction: THREE.Object3D) => void;
217
+ addInteraction: (instance: THREE.Object3D) => void;
228
218
  removeInteraction: (uuid: string) => void;
229
- }
219
+ };
230
220
  export type NgtAttachFunction<TChild = any, TParent = any> = (parent: TParent, child: TChild, store: NgtRxStore<NgtState>) => void | (() => void);
231
221
  export type NgtAfterAttach<TParent extends NgtInstanceNode = NgtInstanceNode, TChild extends NgtInstanceNode = NgtInstanceNode> = {
232
222
  parent: TParent;
233
223
  node: TChild;
234
224
  };
235
- export interface NgtInstanceLocalState {
225
+ export type NgtInstanceLocalState = {
236
226
  /** the state getter of the canvas that the instance is being rendered to */
237
227
  store: NgtRxStore<NgtState>;
238
228
  nonObjects: BehaviorSubject<NgtInstanceNode[]>;
@@ -250,46 +240,14 @@ export interface NgtInstanceLocalState {
250
240
  priority?: number;
251
241
  afterUpdate?: EventEmitter<NgtInstanceNode>;
252
242
  afterAttach?: EventEmitter<NgtAfterAttach>;
253
- }
254
- export type NgtInstanceNode<TNode = any> = TNode & {
243
+ };
244
+ export type NgtInstanceNode<TNode = any> = {
255
245
  __ngt__: NgtInstanceLocalState;
256
- } & NgtAnyRecord;
246
+ } & NgtAnyRecord & TNode;
257
247
  export type NgtGLRenderer = {
258
248
  render: (scene: THREE.Scene, camera: THREE.Camera) => void;
259
249
  };
260
250
  export type NgtGLOptions = NgtGLRenderer | ((canvas: HTMLCanvasElement) => NgtGLRenderer) | Partial<NgtProperties<THREE.WebGLRenderer> | THREE.WebGLRendererParameters> | undefined;
261
- export type NgtExtendedColors<T> = {
262
- [K in keyof T]: T[K] extends THREE.Color | undefined ? THREE.ColorRepresentation : T[K];
263
- };
264
- /**
265
- * If **T** contains a constructor, @see ConstructorParameters must be used, otherwise **T**.
266
- */
267
- export type NgtNodeArgs<T> = T extends new (...args: any) => any ? ConstructorParameters<T> : T;
268
- export interface NgtNodeProps<P> {
269
- attach?: string[];
270
- /** Constructor arguments */
271
- args?: NgtNodeArgs<P>;
272
- }
273
- export type NgtNode<T, P> = NgtExtendedColors<NgtOverwrite<Partial<T>, NgtNodeProps<P>>>;
274
- export type NgtObject3DNode<T, P> = NgtOverwrite<NgtNode<T, P>, {
275
- position?: THREE.Vector3 | Parameters<THREE.Vector3['set']>;
276
- up?: THREE.Vector3 | Parameters<THREE.Vector3['set']>;
277
- scale?: THREE.Vector3 | Parameters<THREE.Vector3['set']>;
278
- rotation?: THREE.Euler | Parameters<THREE.Euler['set']>;
279
- matrix?: THREE.Matrix4 | Parameters<THREE.Matrix4['set']>;
280
- quaternion?: THREE.Quaternion | Parameters<THREE.Quaternion['set']>;
281
- layers?: THREE.Layers | Parameters<THREE.Layers['set']>;
282
- }> & NgtEventHandlers;
283
- export type NgtConditionalType<Child, Parent, Truthy, Falsy> = Child extends Parent ? Truthy : Falsy;
284
- export interface NgtLoaderProto<T> extends THREE.Loader {
285
- load(url: string | string[], onLoad?: (result: T) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void): unknown;
286
- loadAsync(url: string | string[], onProgress?: (event: ProgressEvent) => void): Promise<any>;
287
- }
288
- export interface NgtLoaderExtensions<TLoader extends THREE.Loader = THREE.Loader> {
289
- (loader: TLoader): void;
290
- }
291
- export type NgtLoaderResult<T> = T extends any[] ? NgtLoaderProto<T[number]> : NgtLoaderProto<T>;
292
- export type NgtBranchingReturn<T = any, Parent = any, Coerced = any> = NgtConditionalType<T, Parent, Coerced, T>;
293
251
  export interface NgtObjectMap {
294
252
  nodes: {
295
253
  [name: string]: THREE.Object3D;
@@ -299,16 +257,16 @@ export interface NgtObjectMap {
299
257
  };
300
258
  [key: string]: any;
301
259
  }
302
- export interface NgtCanvasInputs {
260
+ export type NgtCanvasInputs = {
303
261
  /** A threejs renderer instance or props that go into the default renderer */
304
262
  gl?: NgtGLOptions;
305
- /** Dimensions to fit the renderer to. Will measure canvas dimensions if omitted */
306
263
  size?: NgtSize;
307
264
  /**
308
- * Enables PCFsoft shadows. Can accept `gl.shadowMap` options for fine-tuning.
265
+ * Enables shadows (by default PCFsoft). Can accept `gl.shadowMap` options for fine-tuning,
266
+ * but also strings: 'basic' | 'percentage' | 'soft' | 'variance'.
309
267
  * @see https://threejs.org/docs/#api/en/renderers/WebGLRenderer.shadowMap
310
268
  */
311
- shadows?: boolean | Partial<THREE.WebGLShadowMap>;
269
+ shadows?: boolean | 'basic' | 'percentage' | 'soft' | 'variance' | Partial<THREE.WebGLShadowMap>;
312
270
  /**
313
271
  * Disables three r139 color management.
314
272
  * @see https://threejs.org/docs/#manual/en/introduction/Color-management
@@ -316,7 +274,7 @@ export interface NgtCanvasInputs {
316
274
  legacy?: boolean;
317
275
  /** Switch off automatic sRGB encoding and gamma correction */
318
276
  linear?: boolean;
319
- /** Use `NoToneMapping` instead of `ACESFilmicToneMapping` */
277
+ /** Use `THREE.NoToneMapping` instead of `THREE.ACESFilmicToneMapping` */
320
278
  flat?: boolean;
321
279
  /** Creates an orthographic camera */
322
280
  orthographic?: boolean;
@@ -334,8 +292,10 @@ export interface NgtCanvasInputs {
334
292
  dpr?: NgtDpr;
335
293
  /** Props that go into the default raycaster */
336
294
  raycaster?: Partial<THREE.Raycaster>;
295
+ /** A `THREE.Scene` instance or props that go into the default scene */
296
+ scene?: THREE.Scene | Partial<THREE.Scene>;
337
297
  /** A `Camera` instance or props that go into the default camera */
338
- camera?: (NgtCamera | Partial<NgtObject3DNode<THREE.Camera, typeof THREE.Camera> & NgtObject3DNode<THREE.PerspectiveCamera, typeof THREE.PerspectiveCamera> & NgtObject3DNode<THREE.OrthographicCamera, typeof THREE.OrthographicCamera>>) & {
298
+ camera?: (NgtCamera | Partial<THREE.Camera>) & {
339
299
  /** Flags the camera as manual, putting projection into your own hands */
340
300
  manual?: boolean;
341
301
  };
@@ -347,4 +307,15 @@ export interface NgtCanvasInputs {
347
307
  eventPrefix?: 'offset' | 'client' | 'page' | 'layer' | 'screen';
348
308
  /** Default coordinate for the camera to look at */
349
309
  lookAt?: THREE.Vector3 | Parameters<THREE.Vector3['set']>;
310
+ };
311
+ export interface NgtLoader<T> extends THREE.Loader {
312
+ load(url: string, onLoad?: (result: T) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void): unknown;
313
+ loadAsync(url: string, onProgress?: (event: ProgressEvent) => void): Promise<T>;
350
314
  }
315
+ export type NgtLoaderProto<T> = new (...args: any) => NgtLoader<T extends unknown ? any : T>;
316
+ export type NgtLoaderReturnType<T, L extends NgtLoaderProto<T>> = T extends unknown ? Awaited<ReturnType<InstanceType<L>['loadAsync']>> : T;
317
+ export type NgtLoaderExtensions<T extends {
318
+ prototype: NgtLoaderProto<any>;
319
+ }> = (loader: T['prototype']) => void;
320
+ export type NgtConditionalType<Child, Parent, Truthy, Falsy> = Child extends Parent ? Truthy : Falsy;
321
+ export type NgtBranchingReturn<T, Parent, Coerced> = NgtConditionalType<T, Parent, Coerced, T>;
package/lib/utils/is.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { ElementRef } from '@angular/core';
2
2
  import * as THREE from 'three';
3
- import type { NgtEquConfig } from '../types';
3
+ import type { NgtEquConfig, NgtGLRenderer } from '../types';
4
4
  export declare const is: {
5
5
  obj: (a: unknown) => a is object;
6
6
  material: (a: unknown) => a is THREE.Material;
@@ -13,5 +13,10 @@ export declare const is: {
13
13
  object3D: (a: unknown) => a is THREE.Object3D<THREE.Event>;
14
14
  instance: (a: unknown) => a is any;
15
15
  ref: (a: unknown) => a is ElementRef<any>;
16
+ colorSpaceExist: <T extends object | NgtGLRenderer | THREE.Texture, P = T extends NgtGLRenderer ? {
17
+ outputColorSpace: string;
18
+ } : {
19
+ colorSpace: string;
20
+ }>(object: T) => object is T & P;
16
21
  equ(a: any, b: any, { arrays, objects, strict }?: NgtEquConfig): boolean;
17
22
  };