@@ -131,6 +131,8 @@ export class NgtRenderer implements Renderer2 {
131131 const instance = prepare ( new threeTarget ( ...injectedArgs ) , { store, args : injectedArgs } ) ;
132132 const node = this . store . createNode ( 'three' , instance ) ;
133133 const localState = getLocalState ( instance ) ;
134+
135+ // auto-attach for geometry and material
134136 if ( is . geometry ( instance ) ) {
135137 localState . attach = [ 'geometry' ] ;
136138 } else if ( is . material ( instance ) ) {
@@ -243,6 +245,7 @@ export class NgtRenderer implements Renderer2 {
243245 // if child is three but haven't been attached to a parent yet
244246 ( cRS [ NgtRendererClassId . type ] === 'three' && ! getLocalState ( newChild ) . parent ) ||
245247 // or both parent and child are DOM elements
248+ // or they are compound AND haven't had a THREE instance yet
246249 ( ( pRS [ NgtRendererClassId . type ] === 'dom' ||
247250 ( pRS [ NgtRendererClassId . type ] === 'compound' && ! pRS [ NgtRendererClassId . compounded ] ) ) &&
248251 ( cRS [ NgtRendererClassId . type ] === 'dom' ||
@@ -325,10 +328,10 @@ export class NgtRenderer implements Renderer2 {
325328
326329 if ( rS [ NgtRendererClassId . compounded ] . __ngt_renderer__ [ NgtRendererClassId . compound ] ) {
327330 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+ ) ,
332335 } ) ;
333336 }
334337 this . setProperty ( rS [ NgtRendererClassId . compounded ] , name , value ) ;
@@ -341,13 +344,37 @@ export class NgtRenderer implements Renderer2 {
341344 listen ( target : NgtRendererNode , eventName : string , callback : ( event : any ) => boolean | void ) : ( ) => void {
342345 const rS = target . __ngt_renderer__ ;
343346 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
345365 const callbackWithCdr = ( event : any ) => {
346366 const value = callback ( event ) ;
347367 safeDetectChanges ( targetCdr ) ;
348368 safeDetectChanges ( this . store . rootCdr ) ;
349369 return value ;
350370 } ;
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
351378 if ( this . store . isDOM ( target ) ) {
352379 return this . delegate . listen ( target , eventName , callbackWithCdr ) ;
353380 }
@@ -366,21 +393,6 @@ export class NgtRenderer implements Renderer2 {
366393 return this . delegate . listen ( eventTarget , event , callbackWithCdr ) ;
367394 }
368395
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- }
384396 return ( ) => { } ;
385397 }
386398
0 commit comments