Skip to content

Commit 2bca496

Browse files
committed
feat(core): allow provideNgtRenderer to accept options
verbose logging for now
1 parent fb7e85f commit 2bca496

File tree

3 files changed

+33
-21
lines changed

3 files changed

+33
-21
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { makeEnvironmentProviders, RendererFactory2 } from '@angular/core';
22
import { ɵDomRendererFactory2 as DomRendererFactory2 } from '@angular/platform-browser';
3-
import { NgtRendererFactory2 } from 'angular-three';
3+
import { NGT_RENDERER_OPTIONS, NgtRendererFactory2, type NgtRendererFactory2Options } from 'angular-three';
44

5-
export function provideNgtRenderer() {
5+
export function provideNgtRenderer(options: NgtRendererFactory2Options = {}) {
66
return makeEnvironmentProviders([
7+
{ provide: NGT_RENDERER_OPTIONS, useValue: options },
78
{
89
provide: RendererFactory2,
910
useFactory: (domRendererFactory: RendererFactory2) => new NgtRendererFactory2(domRendererFactory),

libs/core/src/lib/directives/common.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export abstract class NgtCommonDirective<TValue> {
2929
protected abstract linkedValue: Signal<TValue | null>;
3030
protected abstract shouldSkipRender: Signal<boolean>;
3131

32-
constructor() {
32+
protected constructor() {
3333
effect(() => {
3434
if (this.shouldSkipRender()) return;
3535

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

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { DOCUMENT } from '@angular/common';
22
import {
33
inject,
44
Injectable,
5+
InjectionToken,
56
Injector,
67
Renderer2,
78
RendererFactory2,
@@ -38,12 +39,17 @@ import {
3839
} from './state';
3940
import { attachThreeNodes, internalDestroyNode, kebabToPascal, NgtRendererClassId, removeThreeChild } from './utils';
4041

41-
declare const ngDevMode: boolean;
42+
export interface NgtRendererFactory2Options {
43+
verbose?: boolean;
44+
}
45+
46+
export const NGT_RENDERER_OPTIONS = new InjectionToken<NgtRendererFactory2Options>('NGT_RENDERER_OPTIONS');
4247

4348
@Injectable()
4449
export class NgtRendererFactory2 implements RendererFactory2 {
4550
private catalogue = injectCatalogue();
4651
private document = inject(DOCUMENT);
52+
private options = inject(NGT_RENDERER_OPTIONS, { optional: true }) || {};
4753
private rendererMap = new Map<string, Renderer2>();
4854

4955
/**
@@ -90,7 +96,10 @@ export class NgtRendererFactory2 implements RendererFactory2 {
9096
return delegateRenderer;
9197
}
9298

93-
this.rendererMap.set(type.id, (renderer = new NgtRenderer2(delegateRenderer, this.catalogue, this.document)));
99+
this.rendererMap.set(
100+
type.id,
101+
(renderer = new NgtRenderer2(delegateRenderer, this.catalogue, this.document, this.options)),
102+
);
94103
return renderer;
95104
}
96105
}
@@ -104,8 +113,13 @@ export class NgtRenderer2 implements Renderer2 {
104113
public delegateRenderer: Renderer2,
105114
private catalogue: Record<string, NgtConstructorRepresentation>,
106115
private document: Document,
116+
private options: NgtRendererFactory2Options,
107117
public count = 1,
108-
) {}
118+
) {
119+
if (!this.options.verbose) {
120+
this.options.verbose = false;
121+
}
122+
}
109123

110124
get data(): { [key: string]: any } {
111125
return { ...this.delegateRenderer.data, __ngt_renderer__: true };
@@ -147,7 +161,6 @@ export class NgtRenderer2 implements Renderer2 {
147161
if (!instanceState || instanceState.type === 'ngt-primitive') {
148162
// if an object isn't already "prepared", we'll prepare it
149163
prepare(object, 'ngt-primitive', instanceState);
150-
instanceState = getInstanceState(object);
151164
}
152165

153166
const primitiveRendererNode = createRendererNode('three', object, this.document);
@@ -239,13 +252,13 @@ export class NgtRenderer2 implements Renderer2 {
239252
const cRS = newChild.__ngt_renderer__;
240253

241254
if (!pRS || !cRS) {
242-
ngDevMode &&
255+
this.options.verbose &&
243256
console.warn('[NGT dev mode] One of parent or child is not a renderer node.', { parent, newChild });
244257
return delegatedFn();
245258
}
246259

247260
if (cRS[NgtRendererClassId.type] === 'comment') {
248-
// if chid is a comment, we'll set the parent then bail.
261+
// if child is a comment, we'll set the parent then bail.
249262
// comment usually means it's part of a templateRef ViewContainerRef or structural directive
250263
setRendererParentNode(newChild, parent);
251264

@@ -377,7 +390,8 @@ export class NgtRenderer2 implements Renderer2 {
377390
// if the child is already destroyed, just skip
378391
return;
379392
}
380-
ngDevMode && console.warn('[NGT dev mode] parent is not found when remove child', { parent, oldChild });
393+
this.options.verbose &&
394+
console.warn('[NGT dev mode] parent is not found when remove child', { parent, oldChild });
381395
return;
382396
}
383397

@@ -466,7 +480,6 @@ export class NgtRenderer2 implements Renderer2 {
466480
return rendererParentNode ?? this.delegateRenderer.parentNode(node);
467481
}
468482

469-
// removeAttribute = this.delegateRenderer.removeAttribute.bind(this.delegateRenderer);
470483
removeAttribute(el: NgtRendererNode, name: string, namespace?: string | null): void {
471484
const rS = el.__ngt_renderer__;
472485
if (!rS || rS[NgtRendererClassId.destroyed]) return this.delegateRenderer.removeAttribute(el, name, namespace);
@@ -482,7 +495,7 @@ export class NgtRenderer2 implements Renderer2 {
482495
if (!rS) return this.delegateRenderer.setAttribute(el, name, value, namespace);
483496

484497
if (rS[NgtRendererClassId.destroyed]) {
485-
ngDevMode &&
498+
this.options.verbose &&
486499
console.warn(`[NGT dev mode] setAttribute is invoked on destroyed renderer node.`, { el, name, value });
487500
return;
488501
}
@@ -526,7 +539,7 @@ export class NgtRenderer2 implements Renderer2 {
526539
const rS = el.__ngt_renderer__;
527540

528541
if (!rS || rS[NgtRendererClassId.destroyed]) {
529-
ngDevMode &&
542+
this.options.verbose &&
530543
console.warn('[NGT dev mode] setProperty is invoked on destroyed renderer node.', { el, name, value });
531544
return;
532545
}
@@ -542,7 +555,7 @@ export class NgtRenderer2 implements Renderer2 {
542555

543556
applyProps(el, value);
544557

545-
if ('geometry' in value && value['geometry'].isBufferGeometry) {
558+
if ('geometry' in value && is.three<THREE.BufferGeometry>(value['geometry'], 'isBufferGeometry')) {
546559
untracked(() => {
547560
instanceState?.updateGeometryStamp();
548561
});
@@ -557,8 +570,6 @@ export class NgtRenderer2 implements Renderer2 {
557570
if (instanceState?.type === 'ngt-value' && name === 'rawValue') {
558571
rS[NgtRendererClassId.rawValue] = value;
559572
if (parent) {
560-
// untrack this attach because this is during setProperty which is a reactive context
561-
// attaching potentially updates signals which is not allowed
562573
untracked(() => attachThreeNodes(parent, el as unknown as NgtInstanceNode));
563574
}
564575
return;
@@ -588,7 +599,7 @@ export class NgtRenderer2 implements Renderer2 {
588599

589600
applyProps(el, { [name]: value });
590601

591-
if (instanceState && name === 'geometry' && value.isBufferGeometry) {
602+
if (instanceState && name === 'geometry' && is.three<THREE.BufferGeometry>(value, 'isBufferGeometry')) {
592603
untracked(() => {
593604
instanceState.updateGeometryStamp();
594605
});
@@ -667,7 +678,7 @@ export class NgtRenderer2 implements Renderer2 {
667678

668679
const cleanup = iS.setPointerEvent?.(eventName as keyof NgtEventHandlers, callback) || (() => {});
669680

670-
// this means the object has already been attaached to the parent and has its store propgated
681+
// this means the object has already been attached to the parent and has its store propagated
671682
if (iS.store) {
672683
iS.addInteraction?.(iS.store);
673684
}
@@ -679,9 +690,9 @@ export class NgtRenderer2 implements Renderer2 {
679690
}
680691

681692
private appendThreeRendererNodes(parent: NgtRendererNode, child: NgtRendererNode) {
682-
// if parent and chlid are the same, skip
693+
// if parent and child are the same, skip
683694
if (parent === child) {
684-
ngDevMode &&
695+
this.options.verbose &&
685696
console.warn('[NGT dev mode] appending THREE.js parent and child but they are the same', {
686697
parent,
687698
child,
@@ -693,7 +704,7 @@ export class NgtRenderer2 implements Renderer2 {
693704

694705
// if child is already attached to a parent, skip
695706
if (cIS?.hierarchyStore.snapshot.parent) {
696-
ngDevMode &&
707+
this.options.verbose &&
697708
console.warn('[NGT dev mode] appending THREE.js parent and child but child is already attached', {
698709
parent,
699710
child,

0 commit comments

Comments
 (0)