Skip to content

Commit f4bc584

Browse files
committed
feat(core): expose rendered output with the component ref
1 parent 90b069b commit f4bc584

File tree

2 files changed

+14
-7
lines changed

2 files changed

+14
-7
lines changed

apps/astro-docs/src/content/docs/core/api/canvas.mdx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,11 @@ export class Experience {
4747

4848
## Outputs
4949

50-
| Property | Description |
51-
| ------------- | ------------------------------------------------------- |
52-
| created | Emit when the canvas is created but before rendering |
53-
| pointerMissed | Emit when a pointer event is not captured by any object |
50+
| Property | Description |
51+
| ------------- | --------------------------------------------------------------- |
52+
| created | Emit `NgtState` when the canvas is created but before rendering |
53+
| rendered | Emit `ComponentRef` when the scene graph is rendered |
54+
| pointerMissed | Emit when a pointer event is not captured by any object |
5455

5556
## Canvas Defaults
5657

libs/core/src/lib/canvas.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,10 @@ import { is } from './utils/is';
5454
},
5555
changeDetection: ChangeDetectionStrategy.OnPush,
5656
})
57-
export class NgtCanvas {
57+
export class NgtCanvas<
58+
TSceneGraph extends Type<any> | 'routed',
59+
TSceneCmp = TSceneGraph extends Type<infer Cmp> ? Cmp : NgtRoutedScene,
60+
> {
5861
private store = injectStore();
5962
private initRoot = injectCanvasRootInitializer();
6063

@@ -63,7 +66,7 @@ export class NgtCanvas {
6366
private environmentInjector = inject(EnvironmentInjector);
6467
private injector = inject(Injector);
6568

66-
sceneGraph = input.required<Type<any>, Type<any> | 'routed'>({
69+
sceneGraph = input.required<Type<TSceneCmp>, TSceneGraph>({
6770
transform: (value) => {
6871
if (value === 'routed') return NgtRoutedScene;
6972
return value;
@@ -91,7 +94,9 @@ export class NgtCanvas {
9194
eventSource = input<HTMLElement | ElementRef<HTMLElement>>();
9295
eventPrefix = input<NonNullable<NgtCanvasOptions['eventPrefix']>>('offset');
9396
lookAt = input<Vector3 | Parameters<Vector3['set']>>();
97+
9498
created = output<NgtState>();
99+
rendered = output<ComponentRef<TSceneCmp>>();
95100
pointerMissed = outputFromObservable(this.store.get('pointerMissed$'));
96101

97102
private glCanvas = viewChild.required<ElementRef<HTMLCanvasElement>>('glCanvas');
@@ -104,7 +109,7 @@ export class NgtCanvas {
104109
private configurator = signal<NgtCanvasConfigurator | null>(null);
105110

106111
private glEnvironmentInjector?: EnvironmentInjector;
107-
private glRef?: ComponentRef<unknown>;
112+
private glRef?: ComponentRef<TSceneCmp>;
108113

109114
constructor() {
110115
// NOTE: this means that everything in NgtCanvas will be in afterNextRender.
@@ -211,5 +216,6 @@ export class NgtCanvas {
211216
});
212217

213218
this.glRef.changeDetectorRef.detectChanges();
219+
this.rendered.emit(this.glRef);
214220
}
215221
}

0 commit comments

Comments
 (0)