angular-three 2.0.0-beta.2 → 2.0.0-beta.21

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 (141) hide show
  1. package/README.md +4 -147
  2. package/esm2022/angular-three.mjs +1 -1
  3. package/esm2022/index.mjs +11 -10
  4. package/esm2022/lib/before-render.mjs +13 -0
  5. package/esm2022/lib/canvas.mjs +130 -161
  6. package/esm2022/lib/directives/args.mjs +13 -11
  7. package/esm2022/lib/directives/common.mjs +29 -27
  8. package/esm2022/lib/directives/key.mjs +29 -0
  9. package/esm2022/lib/directives/parent.mjs +13 -11
  10. package/esm2022/lib/directives/repeat.mjs +5 -6
  11. package/esm2022/lib/dom/events.mjs +6 -1
  12. package/esm2022/lib/events.mjs +75 -58
  13. package/esm2022/lib/instance.mjs +65 -0
  14. package/esm2022/lib/loader.mjs +30 -37
  15. package/esm2022/lib/loop.mjs +6 -3
  16. package/esm2022/lib/portal.mjs +91 -102
  17. package/esm2022/lib/ref.mjs +48 -0
  18. package/esm2022/lib/renderer/catalogue.mjs +7 -0
  19. package/esm2022/lib/renderer/constants.mjs +21 -0
  20. package/esm2022/lib/renderer/index.mjs +419 -0
  21. package/esm2022/lib/renderer/store.mjs +144 -108
  22. package/esm2022/lib/renderer/utils.mjs +63 -48
  23. package/esm2022/lib/roots.mjs +249 -0
  24. package/esm2022/lib/routed-scene.mjs +11 -8
  25. package/esm2022/lib/store.mjs +207 -0
  26. package/esm2022/lib/three-types.mjs +2 -2
  27. package/esm2022/lib/types.mjs +1 -1
  28. package/esm2022/lib/utils/apply-props.mjs +23 -11
  29. package/esm2022/lib/utils/assert-injection-context.mjs +14 -0
  30. package/esm2022/lib/utils/attach.mjs +2 -2
  31. package/esm2022/lib/utils/create-injection-token.mjs +47 -0
  32. package/esm2022/lib/utils/is.mjs +1 -1
  33. package/esm2022/lib/utils/make.mjs +1 -1
  34. package/esm2022/lib/utils/safe-detect-changes.mjs +15 -13
  35. package/esm2022/lib/utils/signal-store.mjs +91 -0
  36. package/esm2022/lib/utils/update.mjs +1 -1
  37. package/fesm2022/angular-three.mjs +1770 -1589
  38. package/fesm2022/angular-three.mjs.map +1 -1
  39. package/index.d.ts +10 -9
  40. package/lib/{di/before-render.d.ts → before-render.d.ts} +1 -1
  41. package/lib/canvas.d.ts +81 -11
  42. package/lib/directives/args.d.ts +2 -2
  43. package/lib/directives/common.d.ts +5 -1
  44. package/lib/directives/key.d.ts +10 -0
  45. package/lib/directives/parent.d.ts +5 -5
  46. package/lib/dom/events.d.ts +3 -2
  47. package/lib/events.d.ts +78 -2
  48. package/lib/instance.d.ts +36 -0
  49. package/lib/loader.d.ts +13 -2
  50. package/lib/loop.d.ts +64 -6
  51. package/lib/portal.d.ts +20 -12
  52. package/lib/{di/ref.d.ts → ref.d.ts} +3 -2
  53. package/lib/renderer/catalogue.d.ts +9 -0
  54. package/lib/renderer/constants.d.ts +20 -0
  55. package/lib/renderer/index.d.ts +5 -0
  56. package/lib/renderer/store.d.ts +19 -15
  57. package/lib/renderer/utils.d.ts +28 -18
  58. package/lib/roots.d.ts +11 -0
  59. package/lib/routed-scene.d.ts +1 -1
  60. package/lib/store.d.ts +143 -0
  61. package/lib/three-types.d.ts +6 -6
  62. package/lib/types.d.ts +1 -309
  63. package/lib/utils/apply-props.d.ts +4 -2
  64. package/lib/utils/attach.d.ts +5 -3
  65. package/lib/utils/create-injection-token.d.ts +27 -0
  66. package/lib/utils/is.d.ts +4 -3
  67. package/lib/utils/make.d.ts +12 -1
  68. package/lib/utils/safe-detect-changes.d.ts +2 -2
  69. package/lib/utils/signal-store.d.ts +17 -0
  70. package/lib/utils/update.d.ts +1 -1
  71. package/metadata.json +1 -1
  72. package/package.json +5 -4
  73. package/plugin/generators.json +47 -17
  74. package/plugin/package.json +2 -5
  75. package/plugin/src/generators/init/compat.d.ts +3 -1
  76. package/plugin/src/generators/init/compat.js +2 -2
  77. package/plugin/src/generators/init/compat.js.map +1 -1
  78. package/plugin/src/generators/init/files/experience/experience.component.html.__tmpl__ +4 -0
  79. package/plugin/src/generators/init/files/experience/experience.component.ts.__tmpl__ +17 -0
  80. package/plugin/src/generators/init/generator.d.ts +6 -0
  81. package/plugin/src/generators/init/generator.js +144 -0
  82. package/plugin/src/generators/init/generator.js.map +1 -0
  83. package/plugin/src/generators/init/schema.json +15 -4
  84. package/plugin/src/generators/init-cannon/compat.d.ts +2 -0
  85. package/plugin/src/generators/init-cannon/compat.js +6 -0
  86. package/plugin/src/generators/init-cannon/compat.js.map +1 -0
  87. package/plugin/src/generators/init-cannon/generator.d.ts +2 -0
  88. package/plugin/src/generators/init-cannon/generator.js +22 -0
  89. package/plugin/src/generators/init-cannon/generator.js.map +1 -0
  90. package/plugin/src/generators/init-cannon/schema.json +6 -0
  91. package/plugin/src/generators/init-postprocessing/compat.d.ts +2 -0
  92. package/plugin/src/generators/init-postprocessing/compat.js +6 -0
  93. package/plugin/src/generators/init-postprocessing/compat.js.map +1 -0
  94. package/plugin/src/generators/init-postprocessing/generator.d.ts +2 -0
  95. package/plugin/src/generators/init-postprocessing/generator.js +20 -0
  96. package/plugin/src/generators/init-postprocessing/generator.js.map +1 -0
  97. package/plugin/src/generators/init-postprocessing/schema.json +6 -0
  98. package/plugin/src/generators/init-soba/compat.d.ts +2 -0
  99. package/plugin/src/generators/init-soba/compat.js +6 -0
  100. package/plugin/src/generators/init-soba/compat.js.map +1 -0
  101. package/plugin/src/generators/init-soba/generator.d.ts +2 -0
  102. package/plugin/src/generators/init-soba/generator.js +26 -0
  103. package/plugin/src/generators/init-soba/generator.js.map +1 -0
  104. package/plugin/src/generators/init-soba/schema.json +6 -0
  105. package/plugin/src/generators/utils.d.ts +2 -0
  106. package/plugin/src/generators/utils.js +34 -0
  107. package/plugin/src/generators/utils.js.map +1 -0
  108. package/plugin/src/generators/versions.d.ts +12 -0
  109. package/plugin/src/generators/versions.js +16 -0
  110. package/plugin/src/generators/versions.js.map +1 -0
  111. package/plugin/src/index.d.ts +3 -1
  112. package/plugin/src/index.js +7 -3
  113. package/plugin/src/index.js.map +1 -1
  114. package/web-types.json +1 -1
  115. package/esm2022/lib/di/before-render.mjs +0 -13
  116. package/esm2022/lib/di/catalogue.mjs +0 -7
  117. package/esm2022/lib/di/ref.mjs +0 -49
  118. package/esm2022/lib/renderer/di.mjs +0 -3
  119. package/esm2022/lib/renderer/enums.mjs +0 -2
  120. package/esm2022/lib/renderer/provider.mjs +0 -18
  121. package/esm2022/lib/renderer/renderer.mjs +0 -365
  122. package/esm2022/lib/stores/signal.store.mjs +0 -81
  123. package/esm2022/lib/stores/store.mjs +0 -423
  124. package/esm2022/lib/utils/assert-in-injection-context.mjs +0 -14
  125. package/esm2022/lib/utils/instance.mjs +0 -63
  126. package/esm2022/lib/utils/signal.mjs +0 -24
  127. package/esm2022/lib/utils/timing.mjs +0 -21
  128. package/lib/di/catalogue.d.ts +0 -3
  129. package/lib/renderer/di.d.ts +0 -2
  130. package/lib/renderer/enums.d.ts +0 -26
  131. package/lib/renderer/provider.d.ts +0 -8
  132. package/lib/renderer/renderer.d.ts +0 -49
  133. package/lib/stores/signal.store.d.ts +0 -20
  134. package/lib/stores/store.d.ts +0 -13
  135. package/lib/utils/instance.d.ts +0 -4
  136. package/lib/utils/signal.d.ts +0 -2
  137. package/lib/utils/timing.d.ts +0 -4
  138. package/plugin/src/generators/init/init.d.ts +0 -5
  139. package/plugin/src/generators/init/init.js +0 -56
  140. package/plugin/src/generators/init/init.js.map +0 -1
  141. /package/lib/utils/{assert-in-injection-context.d.ts → assert-injection-context.d.ts} +0 -0
package/index.d.ts CHANGED
@@ -1,25 +1,26 @@
1
+ export * from './lib/before-render';
1
2
  export * from './lib/canvas';
2
- export * from './lib/di/before-render';
3
- export * from './lib/di/catalogue';
4
- export * from './lib/di/ref';
5
3
  export * from './lib/directives/args';
4
+ export * from './lib/directives/key';
6
5
  export * from './lib/directives/parent';
7
6
  export * from './lib/directives/repeat';
7
+ export { type NgtCamera, type NgtThreeEvent } from './lib/events';
8
+ export * from './lib/instance';
8
9
  export * from './lib/loader';
9
10
  export { addAfterEffect, addEffect, addTail } from './lib/loop';
10
11
  export { NgtPortal, NgtPortalContent } from './lib/portal';
12
+ export * from './lib/ref';
13
+ export * from './lib/renderer';
11
14
  export * from './lib/routed-scene';
12
- export * from './lib/stores/signal.store';
13
- export * from './lib/stores/store';
15
+ export * from './lib/store';
14
16
  export * from './lib/three-types';
15
17
  export * from './lib/types';
16
18
  export * from './lib/utils/apply-props';
17
- export * from './lib/utils/assert-in-injection-context';
19
+ export * from './lib/utils/assert-injection-context';
18
20
  export { createAttachFunction } from './lib/utils/attach';
19
- export * from './lib/utils/instance';
21
+ export * from './lib/utils/create-injection-token';
20
22
  export * from './lib/utils/is';
21
23
  export * from './lib/utils/make';
22
24
  export * from './lib/utils/safe-detect-changes';
23
- export * from './lib/utils/signal';
24
- export * from './lib/utils/timing';
25
+ export * from './lib/utils/signal-store';
25
26
  export * from './lib/utils/update';
@@ -1,5 +1,5 @@
1
1
  import { Injector } from '@angular/core';
2
- import { NgtBeforeRenderRecord } from '../types';
2
+ import { type NgtBeforeRenderRecord } from './store';
3
3
  export declare function injectBeforeRender(cb: NgtBeforeRenderRecord['callback'], { priority, injector }?: {
4
4
  priority?: number;
5
5
  injector?: Injector;
package/lib/canvas.d.ts CHANGED
@@ -1,10 +1,75 @@
1
- import { ElementRef, EventEmitter, ViewContainerRef, type OnChanges, type OnInit, type SimpleChanges, type Type } from '@angular/core';
1
+ import { ElementRef, EventEmitter, type OnChanges, type OnInit, type SimpleChanges, type Type } from '@angular/core';
2
2
  import { type NgxResizeResult } from 'ngx-resize';
3
- import { NgtSignalStore } from './stores/signal.store';
4
- import type { NgtAnyRecord, NgtCanvasInputs, NgtDpr, NgtState } from './types';
3
+ import * as THREE from 'three';
4
+ import type { NgtCamera, NgtEventManager } from './events';
5
+ import { type NgtDpr, type NgtPerformance, type NgtRenderer, type NgtSize, type NgtState } from './store';
6
+ import type { NgtObject3DNode } from './three-types';
7
+ import type { NgtAnyRecord, NgtProperties } from './types';
8
+ import { type NgtSignalStore } from './utils/signal-store';
5
9
  import * as i0 from "@angular/core";
6
- export declare class NgtCanvas extends NgtSignalStore<NgtCanvasInputs> implements OnInit, OnChanges {
7
- #private;
10
+ export type NgtGLOptions = NgtRenderer | ((canvas: HTMLCanvasElement) => NgtRenderer) | Partial<NgtProperties<THREE.WebGLRenderer> | THREE.WebGLRendererParameters> | undefined;
11
+ export type NgtCanvasInputs = {
12
+ /** A threejs renderer instance or props that go into the default renderer */
13
+ gl?: NgtGLOptions;
14
+ size?: NgtSize;
15
+ /**
16
+ * Enables shadows (by default PCFsoft). Can accept `gl.shadowMap` options for fine-tuning,
17
+ * but also strings: 'basic' | 'percentage' | 'soft' | 'variance'.
18
+ * @see https://threejs.org/docs/#api/en/renderers/WebGLRenderer.shadowMap
19
+ */
20
+ shadows?: boolean | 'basic' | 'percentage' | 'soft' | 'variance' | Partial<THREE.WebGLShadowMap>;
21
+ /**
22
+ * Disables three r139 color management.
23
+ * @see https://threejs.org/docs/#manual/en/introduction/Color-management
24
+ */
25
+ legacy?: boolean;
26
+ /** Switch off automatic sRGB encoding and gamma correction */
27
+ linear?: boolean;
28
+ /** Use `THREE.NoToneMapping` instead of `THREE.ACESFilmicToneMapping` */
29
+ flat?: boolean;
30
+ /** Creates an orthographic camera */
31
+ orthographic?: boolean;
32
+ /**
33
+ * R3F's render mode. Set to `demand` to only render on state change or `never` to take control.
34
+ * @see https://docs.pmnd.rs/react-three-fiber/advanced/scaling-performance#on-demand-rendering
35
+ */
36
+ frameloop?: 'always' | 'demand' | 'never';
37
+ /**
38
+ * R3F performance options for adaptive performance.
39
+ * @see https://docs.pmnd.rs/react-three-fiber/advanced/scaling-performance#movement-regression
40
+ */
41
+ performance?: Partial<Omit<NgtPerformance, 'regress'>>;
42
+ /** Target pixel ratio. Can clamp between a range: `[min, max]` */
43
+ dpr?: NgtDpr;
44
+ /** Props that go into the default raycaster */
45
+ raycaster?: Partial<THREE.Raycaster>;
46
+ /** A `THREE.Scene` instance or props that go into the default scene */
47
+ scene?: THREE.Scene | Partial<THREE.Scene>;
48
+ /** A `Camera` instance or props that go into the default camera */
49
+ camera?: (NgtCamera | Partial<NgtObject3DNode<THREE.Camera, typeof THREE.Camera> & NgtObject3DNode<THREE.PerspectiveCamera, typeof THREE.PerspectiveCamera> & NgtObject3DNode<THREE.OrthographicCamera, typeof THREE.OrthographicCamera>>) & {
50
+ /** Flags the camera as manual, putting projection into your own hands */
51
+ manual?: boolean;
52
+ };
53
+ /** An R3F event manager to manage elements' pointer events */
54
+ events?: (store: NgtSignalStore<NgtState>) => NgtEventManager<HTMLElement>;
55
+ /** The target where events are being subscribed to, default: the div that wraps canvas */
56
+ eventSource?: HTMLElement | ElementRef<HTMLElement>;
57
+ /** The event prefix that is cast into canvas pointer x/y events, default: "offset" */
58
+ eventPrefix?: 'offset' | 'client' | 'page' | 'layer' | 'screen';
59
+ /** Default coordinate for the camera to look at */
60
+ lookAt?: THREE.Vector3 | Parameters<THREE.Vector3['set']>;
61
+ };
62
+ export declare class NgtCanvas implements OnInit, OnChanges {
63
+ private store;
64
+ private initRoot;
65
+ private host;
66
+ private viewContainerRef;
67
+ private injector;
68
+ private environmentInjector;
69
+ private zone;
70
+ private destroyRef;
71
+ private cdr;
72
+ private inputs;
8
73
  sceneGraph: Type<unknown>;
9
74
  sceneGraphInputs: NgtAnyRecord;
10
75
  compoundPrefixes: string[];
@@ -24,14 +89,19 @@ export declare class NgtCanvas extends NgtSignalStore<NgtCanvasInputs> implement
24
89
  set lookAt(lookAt: NgtCanvasInputs['lookAt']);
25
90
  set performance(performance: NgtCanvasInputs['performance']);
26
91
  created: EventEmitter<NgtState>;
27
- pointerMissed: EventEmitter<MouseEvent>;
92
+ private inputsEventSource;
93
+ protected hbPointerEvents: import("@angular/core").Signal<"none" | "auto">;
28
94
  glCanvas: ElementRef<HTMLCanvasElement>;
29
- glAnchor: ViewContainerRef;
30
- constructor();
31
- get hbPointerEvents(): "none" | "auto";
95
+ private resizeEffectRef?;
96
+ private configurator?;
97
+ private glEnvironmentInjector?;
98
+ private glRef?;
32
99
  ngOnChanges(changes: SimpleChanges): void;
33
100
  ngOnInit(): void;
34
- onResize({ width, height, top, left }: NgxResizeResult): void;
101
+ onResize(result: NgxResizeResult): void;
102
+ private render;
103
+ private overrideChangeDetectorRef;
104
+ private setSceneGraphInputs;
35
105
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtCanvas, never>;
36
- static ɵcmp: i0.ɵɵComponentDeclaration<NgtCanvas, "ngt-canvas", never, { "sceneGraph": { "alias": "sceneGraph"; "required": true; }; "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; }; "scene": { "alias": "scene"; "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>;
106
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtCanvas, "ngt-canvas", never, { "sceneGraph": { "alias": "sceneGraph"; "required": true; }; "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; }; "scene": { "alias": "scene"; "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"; }, never, never, true, never>;
37
107
  }
@@ -1,10 +1,10 @@
1
1
  import { NgtCommonDirective } from './common';
2
2
  import * as i0 from "@angular/core";
3
3
  export declare class NgtArgs<TArgs extends any[] = any[]> extends NgtCommonDirective {
4
- #private;
4
+ private injectedArgs;
5
5
  set args(args: TArgs | null);
6
6
  get args(): TArgs | null;
7
7
  validate(): boolean;
8
8
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtArgs<any>, never>;
9
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgtArgs<any>, "[args]", never, { "args": { "alias": "args"; "required": false; }; }, {}, never, never, true, never>;
9
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgtArgs<any>, "ng-template[args]", never, { "args": { "alias": "args"; "required": false; }; }, {}, never, never, true, never>;
10
10
  }
@@ -1,8 +1,12 @@
1
1
  import * as i0 from "@angular/core";
2
2
  export declare abstract class NgtCommonDirective {
3
- #private;
3
+ protected static processComment: boolean;
4
+ private vcr;
5
+ private zone;
6
+ private template;
4
7
  protected injected: boolean;
5
8
  protected shouldCreateView: boolean;
9
+ private view?;
6
10
  constructor();
7
11
  abstract validate(): boolean;
8
12
  protected createView(): void;
@@ -0,0 +1,10 @@
1
+ import { NgtCommonDirective } from './common';
2
+ import * as i0 from "@angular/core";
3
+ export declare class NgtKey extends NgtCommonDirective {
4
+ static processComment: boolean;
5
+ private lastKey;
6
+ validate(): boolean;
7
+ set key(key: string | number | object);
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgtKey, never>;
9
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgtKey, "ng-template[key]", never, { "key": { "alias": "key"; "required": false; }; }, {}, never, never, true, never>;
10
+ }
@@ -1,11 +1,11 @@
1
- import { NgtInjectedRef } from '../di/ref';
1
+ import type { NgtRef } from '../ref';
2
2
  import { NgtCommonDirective } from './common';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class NgtParent extends NgtCommonDirective {
5
- #private;
6
- set parent(parent: string | THREE.Object3D | NgtInjectedRef<THREE.Object3D>);
7
- get parent(): string | THREE.Object3D | NgtInjectedRef<THREE.Object3D>;
5
+ private injectedParent;
6
+ set parent(parent: string | NgtRef<THREE.Object3D>);
7
+ get parent(): string | NgtRef<THREE.Object3D>;
8
8
  validate(): boolean;
9
9
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtParent, never>;
10
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgtParent, "[parent]", never, { "parent": { "alias": "parent"; "required": false; }; }, {}, never, never, true, never>;
10
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgtParent, "ng-template[parent]", never, { "parent": { "alias": "parent"; "required": false; }; }, {}, never, never, true, never>;
11
11
  }
@@ -1,4 +1,5 @@
1
- import { NgtSignalStore } from '../stores/signal.store';
2
- import type { NgtEventManager, NgtState } from '../types';
1
+ import { type NgtEventManager } from '../events';
2
+ import type { NgtState } from '../store';
3
+ import type { NgtSignalStore } from '../utils/signal-store';
3
4
  export declare const supportedEvents: readonly ["click", "contextmenu", "dblclick", "pointerup", "pointerdown", "pointerover", "pointerout", "pointerenter", "pointerleave", "pointermove", "pointermissed", "pointercancel", "wheel"];
4
5
  export declare function createPointerEvents(store: NgtSignalStore<NgtState>): NgtEventManager<HTMLElement>;
package/lib/events.d.ts CHANGED
@@ -1,6 +1,82 @@
1
1
  import * as THREE from 'three';
2
- import type { NgtSignalStore } from './stores/signal.store';
3
- import type { NgtDomEvent, NgtState } from './types';
2
+ import type { NgtState } from './store';
3
+ import type { NgtProperties } from './types';
4
+ import type { NgtSignalStore } from './utils/signal-store';
5
+ export interface NgtIntersection extends THREE.Intersection {
6
+ /** The event source (the object which registered the handler) */
7
+ eventObject: THREE.Object3D;
8
+ }
9
+ export interface NgtIntersectionEvent<TSourceEvent> extends NgtIntersection {
10
+ /** The event source (the object which registered the handler) */
11
+ eventObject: THREE.Object3D;
12
+ /** An array of intersections */
13
+ intersections: NgtIntersection[];
14
+ /** vec3.set(pointer.x, pointer.y, 0).unproject(camera) */
15
+ unprojectedPoint: THREE.Vector3;
16
+ /** Normalized event coordinates */
17
+ pointer: THREE.Vector2;
18
+ /** Delta between first click and this event */
19
+ delta: number;
20
+ /** The ray that pierced it */
21
+ ray: THREE.Ray;
22
+ /** The camera that was used by the raycaster */
23
+ camera: NgtCamera;
24
+ /** stopPropagation will stop underlying handlers from firing */
25
+ stopPropagation: () => void;
26
+ /** The original host event */
27
+ nativeEvent: TSourceEvent;
28
+ /** If the event was stopped by calling stopPropagation */
29
+ stopped: boolean;
30
+ }
31
+ export type NgtCamera = THREE.OrthographicCamera | THREE.PerspectiveCamera;
32
+ export type NgtThreeEvent<TEvent> = NgtIntersectionEvent<TEvent> & NgtProperties<TEvent>;
33
+ export type NgtDomEvent = PointerEvent | MouseEvent | WheelEvent;
34
+ export type NgtEventHandlers = {
35
+ click?: (event: NgtThreeEvent<MouseEvent>) => void;
36
+ contextmenu?: (event: NgtThreeEvent<MouseEvent>) => void;
37
+ dblclick?: (event: NgtThreeEvent<MouseEvent>) => void;
38
+ pointerup?: (event: NgtThreeEvent<PointerEvent>) => void;
39
+ pointerdown?: (event: NgtThreeEvent<PointerEvent>) => void;
40
+ pointerover?: (event: NgtThreeEvent<PointerEvent>) => void;
41
+ pointerout?: (event: NgtThreeEvent<PointerEvent>) => void;
42
+ pointerenter?: (event: NgtThreeEvent<PointerEvent>) => void;
43
+ pointerleave?: (event: NgtThreeEvent<PointerEvent>) => void;
44
+ pointermove?: (event: NgtThreeEvent<PointerEvent>) => void;
45
+ pointermissed?: (event: MouseEvent) => void;
46
+ pointercancel?: (event: NgtThreeEvent<PointerEvent>) => void;
47
+ wheel?: (event: NgtThreeEvent<WheelEvent>) => void;
48
+ };
49
+ export type NgtEvents = {
50
+ [TEvent in keyof NgtEventHandlers]-?: EventListener;
51
+ };
52
+ export type NgtFilterFunction = (items: THREE.Intersection[], store: NgtSignalStore<NgtState>) => THREE.Intersection[];
53
+ export type NgtComputeFunction = (event: NgtDomEvent, root: NgtSignalStore<NgtState>, previous: NgtSignalStore<NgtState> | null) => void;
54
+ export interface NgtEventManager<TTarget> {
55
+ /** Determines if the event layer is active */
56
+ enabled: boolean;
57
+ /** Event layer priority, higher prioritized layers come first and may stop(-propagate) lower layer */
58
+ priority: number;
59
+ /** The compute function needs to set up the raycaster and an xy- pointer */
60
+ compute?: NgtComputeFunction;
61
+ /** The filter can re-order or re-structure the intersections */
62
+ filter?: NgtFilterFunction;
63
+ /** The target node the event layer is tied to */
64
+ connected?: TTarget;
65
+ /** All the pointer event handlers through which the host forwards native events */
66
+ handlers?: NgtEvents;
67
+ /** Allows re-connecting to another target */
68
+ connect?: (target: TTarget) => void;
69
+ /** Removes all existing events handlers from the target */
70
+ disconnect?: () => void;
71
+ /** Triggers a onPointerMove with the last known event. This can be useful to enable raycasting without
72
+ * explicit user interaction, for instance when the camera moves a hoverable object underneath the cursor.
73
+ */
74
+ update?: () => void;
75
+ }
76
+ export interface NgtPointerCaptureTarget {
77
+ intersection: NgtIntersection;
78
+ target: Element;
79
+ }
4
80
  export declare function removeInteractivity(store: NgtSignalStore<NgtState>, object: THREE.Object3D): void;
5
81
  export declare function createEvents(store: NgtSignalStore<NgtState>): {
6
82
  handlePointer: (name: string) => (event: NgtDomEvent) => void;
@@ -0,0 +1,36 @@
1
+ import { EventEmitter, type WritableSignal } from '@angular/core';
2
+ import type { NgtEventHandlers } from './events';
3
+ import type { NgtState } from './store';
4
+ import type { NgtAnyRecord } from './types';
5
+ import { type NgtSignalStore } from './utils/signal-store';
6
+ export type NgtAttachFunction<TChild = any, TParent = any> = (parent: TParent, child: TChild, store: NgtSignalStore<NgtState>) => void | (() => void);
7
+ export type NgtAfterAttach<TChild extends NgtInstanceNode = NgtInstanceNode, TParent extends NgtInstanceNode = NgtInstanceNode> = {
8
+ parent: TParent;
9
+ node: TChild;
10
+ };
11
+ export type NgtInstanceLocalState = {
12
+ /** the state getter of the canvas that the instance is being rendered to */
13
+ store: NgtSignalStore<NgtState>;
14
+ nonObjects: WritableSignal<NgtInstanceNode[]>;
15
+ objects: WritableSignal<NgtInstanceNode[]>;
16
+ add: (instance: NgtInstanceNode, type: 'objects' | 'nonObjects') => void;
17
+ remove: (instance: NgtInstanceNode, type: 'objects' | 'nonObjects') => void;
18
+ nativeProps: NgtSignalStore<NgtAnyRecord>;
19
+ parent: WritableSignal<NgtInstanceNode | null>;
20
+ primitive?: boolean;
21
+ eventCount: number;
22
+ handlers: Partial<NgtEventHandlers>;
23
+ args?: unknown[];
24
+ attach?: string[] | NgtAttachFunction;
25
+ previousAttach?: unknown | (() => void);
26
+ isRaw?: boolean;
27
+ priority?: number;
28
+ afterUpdate?: EventEmitter<NgtInstanceNode>;
29
+ afterAttach?: EventEmitter<NgtAfterAttach>;
30
+ };
31
+ export type NgtInstanceNode<TNode = any> = {
32
+ __ngt__: NgtInstanceLocalState;
33
+ } & NgtAnyRecord & TNode;
34
+ export declare function getLocalState<TInstance extends object = NgtAnyRecord>(obj: TInstance | undefined): NgtInstanceLocalState;
35
+ export declare function invalidateInstance<TInstance extends object>(instance: TInstance): void;
36
+ export declare function prepare<TInstance extends object = NgtAnyRecord>(object: TInstance, localState?: Partial<NgtInstanceLocalState>): NgtInstanceNode<TInstance>;
package/lib/loader.d.ts CHANGED
@@ -1,6 +1,17 @@
1
1
  import { Injector, type Signal } from '@angular/core';
2
2
  import type { GLTF } from 'three/examples/jsm/loaders/GLTFLoader';
3
- import type { NgtBranchingReturn, NgtLoaderExtensions, NgtLoaderProto, NgtLoaderReturnType, NgtObjectMap } from './types';
3
+ import { type NgtObjectMap } from './utils/make';
4
+ export interface NgtLoader<T> extends THREE.Loader {
5
+ load(url: string, onLoad?: (result: T) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void): unknown;
6
+ loadAsync(url: string, onProgress?: (event: ProgressEvent) => void): Promise<T>;
7
+ }
8
+ export type NgtLoaderProto<T> = new (...args: any) => NgtLoader<T extends unknown ? any : T>;
9
+ export type NgtLoaderReturnType<T, L extends NgtLoaderProto<T>> = T extends unknown ? Awaited<ReturnType<InstanceType<L>['loadAsync']>> : T;
10
+ export type NgtLoaderExtensions<T extends {
11
+ prototype: NgtLoaderProto<any>;
12
+ }> = (loader: T['prototype']) => void;
13
+ export type NgtConditionalType<Child, Parent, Truthy, Falsy> = Child extends Parent ? Truthy : Falsy;
14
+ export type NgtBranchingReturn<T, Parent, Coerced> = NgtConditionalType<T, Parent, Coerced, T>;
4
15
  export type NgtLoaderResults<TInput extends string | string[] | Record<string, string>, TReturn> = TInput extends string[] ? TReturn[] : TInput extends object ? {
5
16
  [key in keyof TInput]: TReturn;
6
17
  } : TReturn;
@@ -8,4 +19,4 @@ export declare function injectNgtLoader<TData, TUrl extends string | string[] |
8
19
  extensions?: NgtLoaderExtensions<TLoaderConstructor>;
9
20
  onProgress?: (event: ProgressEvent) => void;
10
21
  injector?: Injector;
11
- }): Signal<NgtLoaderResults<TUrl, NgtBranchingReturn<TReturn, GLTF, GLTF & NgtObjectMap>>>;
22
+ }): Signal<NgtLoaderResults<TUrl, NgtBranchingReturn<TReturn, GLTF, GLTF & NgtObjectMap>> | null>;
package/lib/loop.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- import type { NgtSignalStore } from './stores/signal.store';
2
- import type { NgtState } from './types';
3
- export type NgtGlobalRenderCallback = (timestamp: number) => void;
1
+ /// <reference types="webxr" />
2
+ import type { NgtState } from './store';
3
+ import type { NgtSignalStore } from './utils/signal-store';
4
+ export type NgtGlobalRenderCallback = (timeStamp: number) => void;
4
5
  /**
5
6
  * Adds a global render callback which is called each frame.
6
7
  * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#addEffect
@@ -16,9 +17,9 @@ export declare const addAfterEffect: (callback: NgtGlobalRenderCallback) => () =
16
17
  * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#addTail
17
18
  */
18
19
  export declare const addTail: (callback: NgtGlobalRenderCallback) => () => void;
19
- export type GlobalEffectType = 'before' | 'after' | 'tail';
20
- export declare function flushGlobalEffects(type: GlobalEffectType, timestamp: number): void;
21
- export declare function createLoop<TCanvas>(roots: Map<TCanvas, NgtSignalStore<NgtState>>): {
20
+ export type NgtGlobalEffectType = 'before' | 'after' | 'tail';
21
+ export declare function flushGlobalEffects(type: NgtGlobalEffectType, timestamp: number): void;
22
+ declare function createLoop<TCanvas>(roots: Map<TCanvas, NgtSignalStore<NgtState>>): {
22
23
  loop: (timestamp: number) => void;
23
24
  /**
24
25
  * Invalidates the view, requesting a frame to be rendered. Will globally invalidate unless passed a root's state.
@@ -31,3 +32,60 @@ export declare function createLoop<TCanvas>(roots: Map<TCanvas, NgtSignalStore<N
31
32
  */
32
33
  advance: (timestamp: number, runGlobalEffects?: boolean, store?: NgtSignalStore<NgtState>, frame?: XRFrame) => void;
33
34
  };
35
+ export declare const injectNgtLoop: {
36
+ (): {
37
+ loop: (timestamp: number) => void;
38
+ /**
39
+ * Invalidates the view, requesting a frame to be rendered. Will globally invalidate unless passed a root's state.
40
+ * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#invalidate
41
+ */
42
+ invalidate: (store?: NgtSignalStore<NgtState>, frames?: number) => void;
43
+ /**
44
+ * Advances the frameloop and runs render effects, useful for when manually rendering via `frameloop="never"`.
45
+ * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#advance
46
+ */
47
+ advance: (timestamp: number, runGlobalEffects?: boolean, store?: NgtSignalStore<NgtState>, frame?: XRFrame) => void;
48
+ };
49
+ (injectOptions: import("@angular/core").InjectOptions & {
50
+ optional?: false | undefined;
51
+ }): {
52
+ loop: (timestamp: number) => void;
53
+ /**
54
+ * Invalidates the view, requesting a frame to be rendered. Will globally invalidate unless passed a root's state.
55
+ * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#invalidate
56
+ */
57
+ invalidate: (store?: NgtSignalStore<NgtState>, frames?: number) => void;
58
+ /**
59
+ * Advances the frameloop and runs render effects, useful for when manually rendering via `frameloop="never"`.
60
+ * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#advance
61
+ */
62
+ advance: (timestamp: number, runGlobalEffects?: boolean, store?: NgtSignalStore<NgtState>, frame?: XRFrame) => void;
63
+ };
64
+ (injectOptions: import("@angular/core").InjectOptions): {
65
+ loop: (timestamp: number) => void;
66
+ /**
67
+ * Invalidates the view, requesting a frame to be rendered. Will globally invalidate unless passed a root's state.
68
+ * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#invalidate
69
+ */
70
+ invalidate: (store?: NgtSignalStore<NgtState>, frames?: number) => void;
71
+ /**
72
+ * Advances the frameloop and runs render effects, useful for when manually rendering via `frameloop="never"`.
73
+ * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#advance
74
+ */
75
+ advance: (timestamp: number, runGlobalEffects?: boolean, store?: NgtSignalStore<NgtState>, frame?: XRFrame) => void;
76
+ } | null;
77
+ }, NGT_LOOP: import("@angular/core").InjectionToken<{
78
+ loop: (timestamp: number) => void;
79
+ /**
80
+ * Invalidates the view, requesting a frame to be rendered. Will globally invalidate unless passed a root's state.
81
+ * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#invalidate
82
+ */
83
+ invalidate: (store?: NgtSignalStore<NgtState>, frames?: number) => void;
84
+ /**
85
+ * Advances the frameloop and runs render effects, useful for when manually rendering via `frameloop="never"`.
86
+ * @see https://docs.pmnd.rs/react-three-fiber/api/additional-exports#advance
87
+ */
88
+ advance: (timestamp: number, runGlobalEffects?: boolean, store?: NgtSignalStore<NgtState>, frame?: XRFrame) => void;
89
+ }>;
90
+ export type NgtLoop = ReturnType<typeof createLoop>;
91
+ export {};
package/lib/portal.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { EventEmitter, TemplateRef, ViewContainerRef, type ElementRef, type OnInit } from '@angular/core';
2
2
  import * as THREE from 'three';
3
- import { NgtSignalStore } from './stores/signal.store';
4
- import type { NgtEventManager, NgtRenderState, NgtSize, NgtState } from './types';
3
+ import type { NgtEventManager } from './events';
4
+ import { type NgtRenderState, type NgtSize, type NgtState } from './store';
5
5
  import * as i0 from "@angular/core";
6
6
  declare const privateKeys: readonly ["get", "set", "select", "setSize", "setDpr", "setFrameloop", "events", "invalidate", "advance", "size", "viewport"];
7
7
  type PrivateKeys = (typeof privateKeys)[number];
@@ -14,12 +14,12 @@ export interface NgtPortalInputs {
14
14
  }>;
15
15
  }
16
16
  export declare class NgtPortalBeforeRender implements OnInit {
17
- #private;
17
+ private portalStore;
18
+ private injector;
18
19
  renderPriority: number;
19
20
  parentScene: THREE.Scene;
20
21
  parentCamera: THREE.Camera;
21
22
  beforeRender: EventEmitter<NgtRenderState>;
22
- constructor();
23
23
  ngOnInit(): void;
24
24
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtPortalBeforeRender, never>;
25
25
  static ɵdir: i0.ɵɵDirectiveDeclaration<NgtPortalBeforeRender, "[ngtPortalBeforeRender]", never, { "renderPriority": { "alias": "renderPriority"; "required": false; }; "parentScene": { "alias": "parentScene"; "required": true; }; "parentCamera": { "alias": "parentCamera"; "required": true; }; }, { "beforeRender": "beforeRender"; }, never, never, true, never>;
@@ -29,25 +29,33 @@ export declare class NgtPortalContent {
29
29
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtPortalContent, [null, { skipSelf: true; }]>;
30
30
  static ɵdir: i0.ɵɵDirectiveDeclaration<NgtPortalContent, "ng-template[ngtPortalContent]", never, {}, {}, never, never, true, never>;
31
31
  }
32
- export declare class NgtPortal extends NgtSignalStore<NgtPortalInputs> implements OnInit {
33
- #private;
32
+ export declare class NgtPortal implements OnInit {
33
+ private inputs;
34
34
  set container(container: NgtPortalInputs['container']);
35
- set state(state: NgtPortalInputs['state']);
35
+ set portalState(state: NgtPortalInputs['state']);
36
36
  autoRender: boolean;
37
37
  autoRenderPriority: number;
38
38
  beforeRender: EventEmitter<{
39
39
  root: NgtRenderState;
40
40
  portal: NgtRenderState;
41
41
  }>;
42
- readonly portalContentTemplate: TemplateRef<unknown>;
43
- readonly portalContentAnchor: ViewContainerRef;
44
- readonly parentScene: THREE.Scene;
45
- readonly parentCamera: import("./types").NgtCameraManual;
42
+ portalContentTemplate: TemplateRef<unknown>;
43
+ portalContentAnchor: ViewContainerRef;
44
+ private parentStore;
45
+ parentScene: THREE.Scene;
46
+ parentCamera: import("./store").NgtCameraManual;
47
+ private portalStore;
48
+ private injector;
49
+ private zone;
50
+ private raycaster;
51
+ private pointer;
46
52
  portalContentRendered: boolean;
53
+ private portalContentView?;
47
54
  constructor();
48
55
  ngOnInit(): void;
49
56
  onBeforeRender(portal: NgtRenderState): void;
57
+ private inject;
50
58
  static ɵfac: i0.ɵɵFactoryDeclaration<NgtPortal, never>;
51
- 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
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgtPortal, "ngt-portal", never, { "container": { "alias": "container"; "required": false; }; "portalState": { "alias": "state"; "required": false; }; "autoRender": { "alias": "autoRender"; "required": false; }; "autoRenderPriority": { "alias": "autoRenderPriority"; "required": false; }; }, { "beforeRender": "beforeRender"; }, ["portalContentTemplate"], never, true, never>;
52
60
  }
53
61
  export {};
@@ -1,7 +1,8 @@
1
- import { ElementRef, Injector, Signal } from '@angular/core';
2
- import { NgtInstanceNode } from '../types';
1
+ import { ElementRef, type Injector, type Signal } from '@angular/core';
2
+ import { type NgtInstanceNode } from './instance';
3
3
  export type NgtInjectedRef<TElement> = ElementRef<TElement> & {
4
4
  children: (type?: 'objects' | 'nonObjects' | 'both') => Signal<NgtInstanceNode[]>;
5
5
  untracked: TElement;
6
6
  };
7
+ export type NgtRef<TElement> = TElement | NgtInjectedRef<TElement>;
7
8
  export declare function injectNgtRef<TElement>(initial?: ElementRef<TElement> | TElement, injector?: Injector): NgtInjectedRef<TElement>;
@@ -0,0 +1,9 @@
1
+ export type NgtAnyConstructor = new (...args: any[]) => any;
2
+ export declare function extend(objects: object): void;
3
+ export declare const injectNgtCatalogue: {
4
+ (): Record<string, NgtAnyConstructor>;
5
+ (injectOptions: import("@angular/core").InjectOptions & {
6
+ optional?: false | undefined;
7
+ }): Record<string, NgtAnyConstructor>;
8
+ (injectOptions: import("@angular/core").InjectOptions): Record<string, NgtAnyConstructor> | null;
9
+ };
@@ -0,0 +1,20 @@
1
+ export declare const ROUTED_SCENE = "__ngt_renderer_is_routed_scene__";
2
+ export declare const HTML = "__ngt_renderer_is_html";
3
+ export declare const SPECIAL_INTERNAL_ADD_COMMENT = "__ngt_renderer_add_comment__";
4
+ export declare const SPECIAL_DOM_TAG: {
5
+ readonly NGT_PORTAL: "ngt-portal";
6
+ readonly NGT_PRIMITIVE: "ngt-primitive";
7
+ readonly NGT_VALUE: "ngt-value";
8
+ };
9
+ export declare const SPECIAL_PROPERTIES: {
10
+ readonly COMPOUND: "ngtCompound";
11
+ readonly RENDER_PRIORITY: "priority";
12
+ readonly ATTACH: "attach";
13
+ readonly VALUE: "rawValue";
14
+ readonly REF: "ref";
15
+ };
16
+ export declare const SPECIAL_EVENTS: {
17
+ readonly BEFORE_RENDER: "beforeRender";
18
+ readonly AFTER_UPDATE: "afterUpdate";
19
+ readonly AFTER_ATTACH: "afterAttach";
20
+ };
@@ -0,0 +1,5 @@
1
+ import { ChangeDetectorRef } from '@angular/core';
2
+ import { type NgtStore } from '../store';
3
+ export declare function provideNgtRenderer(store: NgtStore, compoundPrefixes: string[], cdr: ChangeDetectorRef): import("@angular/core").EnvironmentProviders;
4
+ export { extend } from './catalogue';
5
+ export { HTML } from './constants';