@@ -131,6 +131,8 @@ export class NgtRenderer implements Renderer2 {
131
131
const instance = prepare ( new threeTarget ( ...injectedArgs ) , { store, args : injectedArgs } ) ;
132
132
const node = this . store . createNode ( 'three' , instance ) ;
133
133
const localState = getLocalState ( instance ) ;
134
+
135
+ // auto-attach for geometry and material
134
136
if ( is . geometry ( instance ) ) {
135
137
localState . attach = [ 'geometry' ] ;
136
138
} else if ( is . material ( instance ) ) {
@@ -243,6 +245,7 @@ export class NgtRenderer implements Renderer2 {
243
245
// if child is three but haven't been attached to a parent yet
244
246
( cRS [ NgtRendererClassId . type ] === 'three' && ! getLocalState ( newChild ) . parent ) ||
245
247
// or both parent and child are DOM elements
248
+ // or they are compound AND haven't had a THREE instance yet
246
249
( ( pRS [ NgtRendererClassId . type ] === 'dom' ||
247
250
( pRS [ NgtRendererClassId . type ] === 'compound' && ! pRS [ NgtRendererClassId . compounded ] ) ) &&
248
251
( cRS [ NgtRendererClassId . type ] === 'dom' ||
@@ -325,10 +328,10 @@ export class NgtRenderer implements Renderer2 {
325
328
326
329
if ( rS [ NgtRendererClassId . compounded ] . __ngt_renderer__ [ NgtRendererClassId . compound ] ) {
327
330
Object . assign ( rS [ NgtRendererClassId . compounded ] . __ngt_renderer__ [ NgtRendererClassId . compound ] , {
328
- props : {
329
- ... rS [ NgtRendererClassId . compounded ] . __ngt_renderer__ [ NgtRendererClassId . compound ] ,
330
- [ name ] : value ,
331
- } ,
331
+ props : Object . assign (
332
+ rS [ NgtRendererClassId . compounded ] . __ngt_renderer__ [ NgtRendererClassId . compound ] ,
333
+ { [ name ] : value }
334
+ ) ,
332
335
} ) ;
333
336
}
334
337
this . setProperty ( rS [ NgtRendererClassId . compounded ] , name , value ) ;
@@ -341,13 +344,37 @@ export class NgtRenderer implements Renderer2 {
341
344
listen ( target : NgtRendererNode , eventName : string , callback : ( event : any ) => boolean | void ) : ( ) => void {
342
345
const rS = target . __ngt_renderer__ ;
343
346
const targetCdr = rS ?. [ NgtRendererClassId . injectorFactory ] ?.( ) . get ( ChangeDetectorRef , null ) ;
344
- // if target is DOM node, then we pass that to delegate Renderer
347
+
348
+ if (
349
+ rS [ NgtRendererClassId . type ] === 'three' ||
350
+ ( rS [ NgtRendererClassId . type ] === 'compound' && rS [ NgtRendererClassId . compounded ] )
351
+ ) {
352
+ const instance = rS [ NgtRendererClassId . compounded ] || target ;
353
+ const priority = getLocalState ( target ) . priority ;
354
+ return processThreeEvent ( instance , priority || 0 , eventName , callback , this . store . rootCdr , targetCdr ! ) ;
355
+ }
356
+
357
+ if ( rS [ NgtRendererClassId . type ] === 'compound' && ! rS [ NgtRendererClassId . compounded ] ) {
358
+ this . store . queueOperation ( target , [
359
+ 'op' ,
360
+ ( ) => this . store . queueOperation ( target , [ 'cleanUp' , this . listen ( target , eventName , callback ) ] ) ,
361
+ ] ) ;
362
+ }
363
+
364
+ // setup a new callback with CDR so that it will trigger change detection properly
345
365
const callbackWithCdr = ( event : any ) => {
346
366
const value = callback ( event ) ;
347
367
safeDetectChanges ( targetCdr ) ;
348
368
safeDetectChanges ( this . store . rootCdr ) ;
349
369
return value ;
350
370
} ;
371
+
372
+ // if the target doesn't have __ngt_renderer__, we delegate
373
+ if ( ! rS ) {
374
+ return this . delegate . listen ( target , eventName , callbackWithCdr ) ;
375
+ }
376
+
377
+ // if target is DOM node, then we pass that to delegate Renderer
351
378
if ( this . store . isDOM ( target ) ) {
352
379
return this . delegate . listen ( target , eventName , callbackWithCdr ) ;
353
380
}
@@ -366,21 +393,6 @@ export class NgtRenderer implements Renderer2 {
366
393
return this . delegate . listen ( eventTarget , event , callbackWithCdr ) ;
367
394
}
368
395
369
- if (
370
- rS [ NgtRendererClassId . type ] === 'three' ||
371
- ( rS [ NgtRendererClassId . type ] === 'compound' && rS [ NgtRendererClassId . compounded ] )
372
- ) {
373
- const instance = rS [ NgtRendererClassId . compounded ] || target ;
374
- const priority = getLocalState ( target ) . priority ;
375
- return processThreeEvent ( instance , priority || 0 , eventName , callback , this . store . rootCdr , targetCdr ! ) ;
376
- }
377
-
378
- if ( rS [ NgtRendererClassId . type ] === 'compound' && ! rS [ NgtRendererClassId . compounded ] ) {
379
- this . store . queueOperation ( target , [
380
- 'op' ,
381
- ( ) => this . store . queueOperation ( target , [ 'cleanUp' , this . listen ( target , eventName , callback ) ] ) ,
382
- ] ) ;
383
- }
384
396
return ( ) => { } ;
385
397
}
386
398
0 commit comments