@@ -2,6 +2,7 @@ import { DOCUMENT } from '@angular/common';
22import {
33 inject ,
44 Injectable ,
5+ InjectionToken ,
56 Injector ,
67 Renderer2 ,
78 RendererFactory2 ,
@@ -38,12 +39,17 @@ import {
3839} from './state' ;
3940import { 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 ( )
4449export 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