@@ -2,6 +2,7 @@ import { DOCUMENT } from '@angular/common';
2
2
import {
3
3
inject ,
4
4
Injectable ,
5
+ InjectionToken ,
5
6
Injector ,
6
7
Renderer2 ,
7
8
RendererFactory2 ,
@@ -38,12 +39,17 @@ import {
38
39
} from './state' ;
39
40
import { attachThreeNodes , internalDestroyNode , kebabToPascal , NgtRendererClassId , removeThreeChild } from './utils' ;
40
41
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' ) ;
42
47
43
48
@Injectable ( )
44
49
export class NgtRendererFactory2 implements RendererFactory2 {
45
50
private catalogue = injectCatalogue ( ) ;
46
51
private document = inject ( DOCUMENT ) ;
52
+ private options = inject ( NGT_RENDERER_OPTIONS , { optional : true } ) || { } ;
47
53
private rendererMap = new Map < string , Renderer2 > ( ) ;
48
54
49
55
/**
@@ -90,7 +96,10 @@ export class NgtRendererFactory2 implements RendererFactory2 {
90
96
return delegateRenderer ;
91
97
}
92
98
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
+ ) ;
94
103
return renderer ;
95
104
}
96
105
}
@@ -104,8 +113,13 @@ export class NgtRenderer2 implements Renderer2 {
104
113
public delegateRenderer : Renderer2 ,
105
114
private catalogue : Record < string , NgtConstructorRepresentation > ,
106
115
private document : Document ,
116
+ private options : NgtRendererFactory2Options ,
107
117
public count = 1 ,
108
- ) { }
118
+ ) {
119
+ if ( ! this . options . verbose ) {
120
+ this . options . verbose = false ;
121
+ }
122
+ }
109
123
110
124
get data ( ) : { [ key : string ] : any } {
111
125
return { ...this . delegateRenderer . data , __ngt_renderer__ : true } ;
@@ -147,7 +161,6 @@ export class NgtRenderer2 implements Renderer2 {
147
161
if ( ! instanceState || instanceState . type === 'ngt-primitive' ) {
148
162
// if an object isn't already "prepared", we'll prepare it
149
163
prepare ( object , 'ngt-primitive' , instanceState ) ;
150
- instanceState = getInstanceState ( object ) ;
151
164
}
152
165
153
166
const primitiveRendererNode = createRendererNode ( 'three' , object , this . document ) ;
@@ -239,13 +252,13 @@ export class NgtRenderer2 implements Renderer2 {
239
252
const cRS = newChild . __ngt_renderer__ ;
240
253
241
254
if ( ! pRS || ! cRS ) {
242
- ngDevMode &&
255
+ this . options . verbose &&
243
256
console . warn ( '[NGT dev mode] One of parent or child is not a renderer node.' , { parent, newChild } ) ;
244
257
return delegatedFn ( ) ;
245
258
}
246
259
247
260
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.
249
262
// comment usually means it's part of a templateRef ViewContainerRef or structural directive
250
263
setRendererParentNode ( newChild , parent ) ;
251
264
@@ -377,7 +390,8 @@ export class NgtRenderer2 implements Renderer2 {
377
390
// if the child is already destroyed, just skip
378
391
return ;
379
392
}
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 } ) ;
381
395
return ;
382
396
}
383
397
@@ -466,7 +480,6 @@ export class NgtRenderer2 implements Renderer2 {
466
480
return rendererParentNode ?? this . delegateRenderer . parentNode ( node ) ;
467
481
}
468
482
469
- // removeAttribute = this.delegateRenderer.removeAttribute.bind(this.delegateRenderer);
470
483
removeAttribute ( el : NgtRendererNode , name : string , namespace ?: string | null ) : void {
471
484
const rS = el . __ngt_renderer__ ;
472
485
if ( ! rS || rS [ NgtRendererClassId . destroyed ] ) return this . delegateRenderer . removeAttribute ( el , name , namespace ) ;
@@ -482,7 +495,7 @@ export class NgtRenderer2 implements Renderer2 {
482
495
if ( ! rS ) return this . delegateRenderer . setAttribute ( el , name , value , namespace ) ;
483
496
484
497
if ( rS [ NgtRendererClassId . destroyed ] ) {
485
- ngDevMode &&
498
+ this . options . verbose &&
486
499
console . warn ( `[NGT dev mode] setAttribute is invoked on destroyed renderer node.` , { el, name, value } ) ;
487
500
return ;
488
501
}
@@ -526,7 +539,7 @@ export class NgtRenderer2 implements Renderer2 {
526
539
const rS = el . __ngt_renderer__ ;
527
540
528
541
if ( ! rS || rS [ NgtRendererClassId . destroyed ] ) {
529
- ngDevMode &&
542
+ this . options . verbose &&
530
543
console . warn ( '[NGT dev mode] setProperty is invoked on destroyed renderer node.' , { el, name, value } ) ;
531
544
return ;
532
545
}
@@ -542,7 +555,7 @@ export class NgtRenderer2 implements Renderer2 {
542
555
543
556
applyProps ( el , value ) ;
544
557
545
- if ( 'geometry' in value && value [ 'geometry' ] . isBufferGeometry ) {
558
+ if ( 'geometry' in value && is . three < THREE . BufferGeometry > ( value [ 'geometry' ] , ' isBufferGeometry' ) ) {
546
559
untracked ( ( ) => {
547
560
instanceState ?. updateGeometryStamp ( ) ;
548
561
} ) ;
@@ -557,8 +570,6 @@ export class NgtRenderer2 implements Renderer2 {
557
570
if ( instanceState ?. type === 'ngt-value' && name === 'rawValue' ) {
558
571
rS [ NgtRendererClassId . rawValue ] = value ;
559
572
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
562
573
untracked ( ( ) => attachThreeNodes ( parent , el as unknown as NgtInstanceNode ) ) ;
563
574
}
564
575
return ;
@@ -588,7 +599,7 @@ export class NgtRenderer2 implements Renderer2 {
588
599
589
600
applyProps ( el , { [ name ] : value } ) ;
590
601
591
- if ( instanceState && name === 'geometry' && value . isBufferGeometry ) {
602
+ if ( instanceState && name === 'geometry' && is . three < THREE . BufferGeometry > ( value , ' isBufferGeometry' ) ) {
592
603
untracked ( ( ) => {
593
604
instanceState . updateGeometryStamp ( ) ;
594
605
} ) ;
@@ -667,7 +678,7 @@ export class NgtRenderer2 implements Renderer2 {
667
678
668
679
const cleanup = iS . setPointerEvent ?.( eventName as keyof NgtEventHandlers , callback ) || ( ( ) => { } ) ;
669
680
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
671
682
if ( iS . store ) {
672
683
iS . addInteraction ?.( iS . store ) ;
673
684
}
@@ -679,9 +690,9 @@ export class NgtRenderer2 implements Renderer2 {
679
690
}
680
691
681
692
private appendThreeRendererNodes ( parent : NgtRendererNode , child : NgtRendererNode ) {
682
- // if parent and chlid are the same, skip
693
+ // if parent and child are the same, skip
683
694
if ( parent === child ) {
684
- ngDevMode &&
695
+ this . options . verbose &&
685
696
console . warn ( '[NGT dev mode] appending THREE.js parent and child but they are the same' , {
686
697
parent,
687
698
child,
@@ -693,7 +704,7 @@ export class NgtRenderer2 implements Renderer2 {
693
704
694
705
// if child is already attached to a parent, skip
695
706
if ( cIS ?. hierarchyStore . snapshot . parent ) {
696
- ngDevMode &&
707
+ this . options . verbose &&
697
708
console . warn ( '[NGT dev mode] appending THREE.js parent and child but child is already attached' , {
698
709
parent,
699
710
child,
0 commit comments