@@ -8,14 +8,15 @@ import {
88 RendererFactory2 ,
99 RendererType2 ,
1010} from '@angular/core' ;
11+ import { take } from 'rxjs' ;
1112import { NGT_CATALOGUE } from '../di/catalogue' ;
1213import { NgtStore } from '../stores/store' ;
1314import { NgtAnyRecord } from '../types' ;
1415import { getLocalState , prepare } from '../utils/instance' ;
1516import { is } from '../utils/is' ;
1617import { NGT_COMPOUND_PREFIXES } from './di' ;
1718import { NgtRendererClassId } from './enums' ;
18- import { NgtRendererNode , NgtRendererStore } from './state' ;
19+ import { NgtRendererNode , NgtRendererState , NgtRendererStore } from './state' ;
1920import { attachThreeChild , kebabToPascal , processThreeEvent , removeThreeChild , SPECIAL_DOM_TAG } from './utils' ;
2021
2122@Injectable ( )
@@ -99,7 +100,14 @@ export class NgtRenderer implements Renderer2 {
99100 ) ;
100101 }
101102
102- const { injectedArgs, store } = this . store . getCreationState ( ) ;
103+ const { injectedArgs, injectedParent, store } = this . store . getCreationState ( ) ;
104+
105+ let parent = injectedParent as NgtRendererState [ NgtRendererClassId . injectedParent ] ;
106+ if ( typeof injectedParent === 'string' ) {
107+ parent = store
108+ . get ( 'scene' )
109+ . getObjectByName ( injectedParent ) as unknown as NgtRendererState [ NgtRendererClassId . injectedParent ] ;
110+ }
103111
104112 // handle primitive
105113 if ( name === SPECIAL_DOM_TAG . NGT_PRIMITIVE ) {
@@ -111,7 +119,11 @@ export class NgtRenderer implements Renderer2 {
111119 localState = getLocalState ( object ) ;
112120 }
113121 if ( ! localState . store ) localState . store = store ;
114- return this . store . createNode ( 'three' , object ) ;
122+ const node = this . store . createNode ( 'three' , object ) ;
123+ if ( parent ) {
124+ node . __ngt_renderer__ [ NgtRendererClassId . injectedParent ] = parent ;
125+ }
126+ return node ;
115127 }
116128
117129 const threeTag = name . startsWith ( 'ngt' ) ? name . slice ( 4 ) : name ;
@@ -127,6 +139,11 @@ export class NgtRenderer implements Renderer2 {
127139 } else if ( is . material ( instance ) ) {
128140 localState . attach = [ 'material' ] ;
129141 }
142+
143+ if ( parent ) {
144+ node . __ngt_renderer__ [ NgtRendererClassId . injectedParent ] = parent ;
145+ }
146+
130147 return node ;
131148 }
132149
@@ -148,6 +165,17 @@ export class NgtRenderer implements Renderer2 {
148165 return ;
149166 }
150167
168+ if ( cRS [ NgtRendererClassId . injectedParent ] ) {
169+ if ( is . ref ( cRS [ NgtRendererClassId . injectedParent ] ) ) {
170+ cRS [ NgtRendererClassId . injectedParent ] . $ . pipe ( take ( 1 ) ) . subscribe ( ( val ) => {
171+ this . appendChild ( val , newChild ) ;
172+ } ) ;
173+ } else {
174+ this . appendChild ( cRS [ NgtRendererClassId . injectedParent ] , newChild ) ;
175+ }
176+ return ;
177+ }
178+
151179 this . store . setParent ( newChild , parent ) ;
152180 this . store . addChild ( parent , newChild ) ;
153181
@@ -234,7 +262,7 @@ export class NgtRenderer implements Renderer2 {
234262 // refChild: NgtRendererNode
235263 // isMove?: boolean | undefined
236264 ) : void {
237- if ( ! parent . __ngt_renderer__ || parent === newChild ) return ;
265+ if ( parent == null || ! parent . __ngt_renderer__ || parent === newChild ) return ;
238266 this . appendChild ( parent , newChild ) ;
239267 }
240268
0 commit comments