Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit bc67fe5

Browse files
committed
wip
1 parent 8d3573f commit bc67fe5

File tree

7 files changed

+64
-24
lines changed

7 files changed

+64
-24
lines changed
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
1-
<ngt-canvas [sceneGraph]="sceneGraph" />
1+
<button (click)="active.set(!active())" class="px-4 py-2 bg-gray-800 text-white rounded">
2+
Click me outside Canvas
3+
</button>
4+
<ngt-canvas [sceneGraph]="sceneGraph" [camera]="{position: [0, 3, 10]}" />
Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,42 @@
1+
import { NgIf } from '@angular/common';
12
import { Component, signal } from '@angular/core';
23
import { NgtArgs, NgtCanvas } from 'angular-three';
34
import { NgtsOrbitControls } from 'angular-three-soba/controls';
5+
import { NgtsHtml } from 'angular-three-soba/misc';
6+
import { NgtsSobaContent } from 'angular-three-soba/utils';
7+
8+
const active = signal(false);
9+
10+
@Component({
11+
selector: 'cubes-html-button',
12+
standalone: true,
13+
template: `
14+
<button
15+
(click)="active.set(!active())"
16+
type="button"
17+
class="transition-colors duration-1000 text-white px-2 py-1 rounded shadow"
18+
[class]="active() ? ['bg-red-400', 'hover:bg-red-600'] : ['bg-blue-400', 'hover:bg-blue-600']"
19+
>
20+
Click me
21+
</button>
22+
<div *ngIf="active()">Extra content under ngIf</div>
23+
`,
24+
imports: [NgIf],
25+
})
26+
export class Button {
27+
active = active;
28+
}
429

530
@Component({
631
standalone: true,
732
templateUrl: './scene.html',
8-
imports: [NgtsOrbitControls, NgtArgs],
33+
imports: [NgtsOrbitControls, NgtArgs, NgtsHtml, NgtsSobaContent, Button],
934
})
10-
class Scene {
35+
export class Scene {
1136
hover = signal(false);
1237

1338
onBeforeRender(cube: THREE.Mesh) {
14-
cube.rotation.x += 0.01;
39+
cube.rotation.y += 0.01;
1540
}
1641
}
1742

@@ -22,4 +47,5 @@ class Scene {
2247
})
2348
export default class Cubes {
2449
sceneGraph = Scene;
50+
active = active;
2551
}
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<ngt-spot-light #light [position]="[0, 1.5, 1.5]" [intensity]="5" />
2-
<ngt-spot-light-helper *args="[light, 'red']" />
2+
<!-- <ngt-spot-light-helper *args="[light, 'red']" /> -->
33

44
<ngt-mesh
55
(beforeRender)="onBeforeRender($event.object)"
@@ -8,6 +8,9 @@
88
>
99
<ngt-box-geometry />
1010
<ngt-mesh-lambert-material [color]="hover() ? 'hotpink' : 'orange'" />
11+
<ngts-html [position]="[0, 2, 0]" [transform]="true">
12+
<cubes-html-button *ngtsSobaContent />
13+
</ngts-html>
1114
</ngt-mesh>
1215

1316
<ngts-orbit-controls />

libs/core/src/lib/canvas.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -255,18 +255,22 @@ export class NgtCanvas implements OnInit, OnChanges {
255255

256256
const inputs = this.inputs.select();
257257
// TODO: Double-check when effect is made not depended on zone
258-
this.resizeEffectRef = effect(
259-
() => {
260-
if (!this.configurator) this.configurator = this.initRoot(this.glCanvas.nativeElement);
261-
this.configurator.configure({ ...inputs(), size: result });
262-
263-
if (this.glRef) {
264-
safeDetectChanges(this.cdr);
265-
} else {
266-
this.render();
267-
}
268-
},
269-
{ manualCleanup: true, injector: this.injector },
258+
this.resizeEffectRef = this.zone.run(() =>
259+
effect(
260+
() => {
261+
this.zone.runOutsideAngular(() => {
262+
if (!this.configurator) this.configurator = this.initRoot(this.glCanvas.nativeElement);
263+
this.configurator.configure({ ...inputs(), size: result });
264+
265+
if (this.glRef) {
266+
safeDetectChanges(this.cdr);
267+
} else {
268+
this.render();
269+
}
270+
});
271+
},
272+
{ manualCleanup: true, injector: this.injector },
273+
),
270274
);
271275
}
272276
}

libs/core/src/lib/renderer/index.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import type { NgtInjectedRef } from '../ref';
1919
import { injectNgtStore, provideNgtStore, type NgtStore } from '../store';
2020
import type { NgtAnyRecord } from '../types';
2121
import { is } from '../utils/is';
22+
import { safeDetectChanges } from '../utils/safe-detect-changes';
2223
import { injectNgtCatalogue, type NgtAnyConstructor } from './catalogue';
2324
import { HTML, ROUTED_SCENE, SPECIAL_DOM_TAG } from './constants';
2425
import { NGT_COMPOUND_PREFIXES, NgtRendererStore, type NgtRendererNode, type NgtRendererState } from './store';
@@ -428,7 +429,13 @@ class NgtRenderer implements Renderer2 {
428429
// if the target doesn't have __ngt_renderer__, we delegate
429430
// if target is DOM node, then we pass that to delegate Renderer
430431
if (!rS || this.store.isDOM(target)) {
431-
return this.delegate.listen(target, eventName, callback);
432+
const targetCdr = getDebugNode(target)?.injector.get(ChangeDetectorRef, null);
433+
const updatedCallback = (event: any) => {
434+
const callbackValue = callback(event);
435+
safeDetectChanges(targetCdr || this.cdr);
436+
return callbackValue;
437+
};
438+
return this.delegate.listen(target, eventName, updatedCallback);
432439
}
433440

434441
if (

libs/core/src/lib/roots.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { DestroyRef, effect, inject, type EffectRef, type Injector } from '@angular/core';
1+
import { DestroyRef, Injector, effect, inject, type EffectRef } from '@angular/core';
22
import { assertInjector } from 'ngxtension/assert-injector';
33
import * as THREE from 'three';
44
import type { NgtCanvasInputs } from './canvas';
@@ -18,6 +18,7 @@ export const roots = new Map<HTMLCanvasElement, NgtSignalStore<NgtState>>();
1818

1919
export function injectCanvasRootInitializer(injector?: Injector) {
2020
return assertInjector(injectCanvasRootInitializer, injector, () => {
21+
const assertedInjector = inject(Injector);
2122
const injectedStore = injectNgtStore();
2223
const loop = injectNgtLoop();
2324
const destroyRef = inject(DestroyRef);
@@ -263,7 +264,7 @@ export function injectCanvasRootInitializer(injector?: Injector) {
263264
invalidateRef?.destroy();
264265
invalidateRef = effect(() => void store.state().invalidate(), {
265266
manualCleanup: true,
266-
injector,
267+
injector: assertedInjector,
267268
});
268269
});
269270
},

libs/core/src/lib/utils/create-api-token.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,6 @@ export function createApiToken<TObject extends { api: any }, TApi = TObject exte
88
return obj.api;
99
}
1010

11-
const object = forwardedObject();
12-
13-
apiFactory.name = `API for ${object.name || object}`;
14-
1511
const [injectFn, provideFn] = createInjectionToken(apiFactory, {
1612
isRoot: false,
1713
deps: [forwardRef(forwardedObject)],

0 commit comments

Comments
 (0)