-
Notifications
You must be signed in to change notification settings - Fork 101
/
Model.tsx
77 lines (70 loc) · 2.24 KB
/
Model.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import { ISceneLoaderProgressEvent } from '@babylonjs/core/Loading/sceneLoader.js'
import { AbstractMesh } from '@babylonjs/core/Meshes/abstractMesh.js'
import React, { useEffect, forwardRef, ReactNode } from 'react'
import { FiberAbstractMeshProps, FiberAbstractMeshPropsCtor } from '../generatedProps'
import { ILoadedModel } from '../hooks/loaders/loadedModel'
import { SceneLoaderOptions, useSceneLoader } from '../hooks/loaders/useSceneLoader'
export type ModelProps = {
/**
* Only used on init. Will not update dynamically (scaling will update dynamically and override this)
* An array of mesh names, a single mesh name, or empty string for all meshes that filter what meshes are imported
*/
meshNames?: any
receiveShadows?: boolean
rootUrl: string
sceneFilename: string
pluginExtension?: string
alwaysSelectAsActiveMesh?: boolean
reportProgress?: boolean
scaleToDimension?: number
onModelLoaded?: (model: ILoadedModel) => void
onModelError?: (model: ILoadedModel) => void
onLoadProgress?: (event: ISceneLoaderProgressEvent) => void
onCreated?: (rootMesh: AbstractMesh) => void
} & FiberAbstractMeshProps &
FiberAbstractMeshPropsCtor & { children?: ReactNode | undefined }
const Model = forwardRef<AbstractMesh, ModelProps>((props, ref) => {
const {
alwaysSelectAsActiveMesh,
meshNames,
onLoadProgress,
onModelError,
onModelLoaded,
receiveShadows,
reportProgress,
scaleToDimension, // SceneLoaderOptions
rootUrl,
sceneFilename,
pluginExtension, // other parameters
children,
...rest // passed on to "rootMesh"
} = props
const options: SceneLoaderOptions = {
alwaysSelectAsActiveMesh,
meshNames,
onLoadProgress,
onModelError,
onModelLoaded,
receiveShadows,
reportProgress,
scaleToDimension,
}
const sceneLoaderResults = useSceneLoader(rootUrl, sceneFilename, pluginExtension, options, rest)
useEffect(() => {
return () => {
// console.log('disposing the sceneloader results.')
sceneLoaderResults.dispose()
}
}, [])
return (
<abstractMesh
ref={ref}
fromInstance={sceneLoaderResults.rootMesh!}
childMeshesNotTracked
{...rest}
>
{children}
</abstractMesh>
)
})
export default Model