@@ -5,7 +5,7 @@ import * as GENERATED from './generatedCode';
5
5
import * as CUSTOM_HOSTS from './customHosts' ;
6
6
7
7
import { CreatedInstance , CreatedInstanceMetadata , CustomProps } from './CreatedInstance' ;
8
- import { HasPropsHandlers , PropertyUpdate , UpdatePayload , PropsHandler } from './PropsHandler' ;
8
+ import { HasPropsHandlers , PropertyUpdate , UpdatePayload , PropsHandler , CustomPropsHandler , PropChangeType } from './PropsHandler' ;
9
9
import { LifecycleListener } from "./LifecycleListener" ;
10
10
import { GeneratedParameter , CreationType } from './codeGenerationDescriptors' ;
11
11
import { applyUpdateToInstance , applyInitialPropsToCreatedInstance } from './UpdateInstance' ;
@@ -125,17 +125,40 @@ function addChild(parent: CreatedInstance<any> | undefined, child: CreatedInstan
125
125
console . error ( 'undefined child' , parent ) ;
126
126
} else {
127
127
// doubly linking child to parent
128
- parent . children . push ( child ) // TODO: need to remove from children as well when removing.
129
- child . parent = parent
128
+ parent . children . push ( child ) ;
129
+ child . parent = parent ;
130
130
}
131
131
}
132
132
133
133
if ( child && child . lifecycleListener && child . lifecycleListener . onParented ) {
134
- child . lifecycleListener . onParented ( parent ! , child )
134
+ child . lifecycleListener . onParented ( parent ! , child ) ;
135
135
}
136
136
137
137
if ( parent && parent . lifecycleListener && parent . lifecycleListener . onChildAdded ) {
138
- parent . lifecycleListener . onChildAdded ( child , parent )
138
+ parent . lifecycleListener . onChildAdded ( child , parent ) ;
139
+ }
140
+ }
141
+
142
+ /**
143
+ * Allows constructor arguments to register for dynamically registered property transforms (should exclude undefined).
144
+ * TODO: include other types or add "PropsChangeType" to GeneratedParameters (would increase bundle size)
145
+ *
146
+ * @param type generated name (not same as PropChangeType)
147
+ * @param value parameter value
148
+ */
149
+ const getConstructorValue = ( type : string , value : any ) : any => {
150
+ switch ( type ) {
151
+ case 'BabylonjsCoreVector3' :
152
+ const v3result = CustomPropsHandler . HandlePropsChange ( PropChangeType . Vector3 , undefined , value ) ;
153
+ return v3result . processed ? v3result . value : value ;
154
+ case 'BabylonjsCoreColor3' :
155
+ const c3result = CustomPropsHandler . HandlePropsChange ( PropChangeType . Vector3 , undefined , value ) ;
156
+ return c3result . processed ? c3result . value : value ;
157
+ case 'BabylonjsCoreColor4' :
158
+ const c4result = CustomPropsHandler . HandlePropsChange ( PropChangeType . Color4 , undefined , value ) ;
159
+ return c4result . processed ? c4result . value : value ;
160
+ default :
161
+ return value ;
139
162
}
140
163
}
141
164
@@ -335,7 +358,7 @@ const ReactBabylonJSHostConfig: HostConfig<
335
358
} else {
336
359
const createInfoArgs = classDefinition . CreateInfo ;
337
360
metadata = classDefinition . Metadata ;
338
- let generatedParameters : GeneratedParameter [ ] = createInfoArgs . parameters
361
+ let generatedParameters : GeneratedParameter [ ] = createInfoArgs . parameters ;
339
362
340
363
if ( props . fromInstance !== undefined ) {
341
364
if ( createInfoArgs . namespace . startsWith ( '@babylonjs/' ) ) {
@@ -356,25 +379,25 @@ const ReactBabylonJSHostConfig: HostConfig<
356
379
let args = generatedParameters . map ( generatedParameter => {
357
380
if ( Array . isArray ( generatedParameter . type ) ) {
358
381
// TODO: if all props are missing, warn if main prop (ie: options) is required.
359
- let newParameter = { } as any
382
+ let newParameter = { } as any ;
360
383
generatedParameter . type . forEach ( subParameter => {
361
- let subPropValue = props [ subParameter . name ]
384
+ let subPropValue = getConstructorValue ( subParameter . type as string , props [ subParameter . name ] ) ;
362
385
if ( subPropValue === undefined && subParameter . optional === false && generatedParameter . optional === false ) {
363
- console . warn ( "Missing a required secondary property:" , subParameter . name )
386
+ console . warn ( "Missing a required secondary property:" , subParameter . name ) ;
364
387
} else {
365
- newParameter [ subParameter . name ] = subPropValue
388
+ newParameter [ subParameter . name ] = subPropValue ;
366
389
}
367
390
} )
368
- return newParameter
391
+ return newParameter ;
369
392
} else {
370
- let value = props [ generatedParameter . name ]
393
+ let value = getConstructorValue ( generatedParameter . type , props [ generatedParameter . name ] ) ;
371
394
if ( value === undefined ) {
372
395
// NOTE: we removed the hosted Scene component, which needs (generatedParameter.type == "BabylonjsCoreEngine")
373
396
// SceneOrEngine type is Scene
374
397
if ( generatedParameter . type . includes ( "BabylonjsCoreScene" ) || ( generatedParameter . type === "any" && generatedParameter . name === "scene" ) ) {
375
398
// MeshBuild.createSphere(name: string, options: {...}, scene: any)
376
399
// console.log('Assigning scene to:', type, generatedParameter)
377
- value = scene
400
+ value = scene ;
378
401
}
379
402
}
380
403
0 commit comments